【发布时间】:2018-08-09 22:44:14
【问题描述】:
编辑:我的问题与建议的副本不同,因为我已经有了实现lowest 的方法。我的问题不是如何实现lowest,而是如何优化lowest 运行得更快。
假设我有一个数组a。例如:
import numpy as np
a = np.array([2, 1, 3, 4, 5, 6, 7, 8, 9])
假设我有一个浮点数x。例如:
x = 6.5
我想返回a 中大于或等于x 的最小值。所以在这种情况下...
print lowest(a, x)
>>> 7
我已经尝试了一些函数来代替lowest。例如:
def lowest(a, x):
""" `a` should be a sorted numpy array"""
return lowest[lowest >= x][0]
def lowest(a, x):
""" `a` should be a sorted `list`, not a numpy array"""
k = sorted(a + [x])
return k[k.index(x) + 1]
但是,函数 lowest 仍然是我代码的瓶颈,大约为 90%。
有没有更快的方法来实现函数lowest?
关于我的代码的一些规则:
-
a可以假定长度为 10 - 函数
lowest至少运行了100k 次。这可能是一个设计问题,但如果我的问题首先得到更快的实现,我很感兴趣。 -
a可以在运行这些循环之前进行预处理。x会有所不同,但a不会。 - 可以假设
a[0] <= x <= a[-1]总是True
【问题讨论】:
-
您的第一个函数使用了无效的语法。你的第二个执行非常低效的操作。这应该是时间上的 O(n) 和空间上的 O(1),或最多 O(n)。
-
我刚刚意识到
a已排序。在这种情况下,时间上应该是 O(log n),空间上应该是 O(1)。 -
@MadPhysicist 该数组在我看来没有排序。
-
@miradulo: "
a可以在运行这些循环之前进行预处理。x会有所不同,但a不会。"。这是直接引用。 -
a[a >= x].min(),或者,如果a已排序,则a[a >= x][0]。
标签: python python-2.7 numpy optimization