【发布时间】:2014-11-13 21:44:58
【问题描述】:
找到最大子数组的标准方法是Kadene's algorithm。如果输入是一个大型numpy数组,有什么比原生python实现更快的吗?
import timeit
setup = '''
import random
import numpy as np
def max_subarray(A):
max_so_far = max_ending_here = 0
for x in A:
max_ending_here = max(0, max_ending_here + x)
max_so_far = max(max_so_far, max_ending_here)
return max_so_far
B = np.random.randint(-100,100,size=100000)
'''
print min(timeit.Timer('max_subarray(B)',setup=setup).repeat(5, 100))
【问题讨论】:
-
更好是什么意思?快点?您绝对可以比纯 python 实现更快。您可以使用 Cython 进行优化,用纯 C 编写并通过
ctypes或Cython包含它,例如 -
@cel 是的,如果我不清楚,对不起。更好 => 更快。由于 numpy 数组已经是一种优化的数据类型(例如固定数据类型、连续数组等),我想知道是否有(numpy)内置操作可以利用。我没有想到 Cython 路线,因为我不熟悉它。
-
您只是希望它快速执行还是以良好的时间复杂度执行?无论如何,只需在 numpy 中执行
cumsum和sort就会非常快:) -
@Wolph 我正在寻找真实世界的执行时间,因为 Kadene 已经是 O(N)。 cumsum/sort 组合如何工作?那不需要数组的初始索引在开头吗?如果确实有效,请将时间与发布的答案进行比较,我可以接受!
-
这种顺序数组更新通常不可能向量化,除非它恰好符合某些内置函数。不过,我认为这里不是这种情况......
标签: python numpy subset subset-sum