在IPython的筆記本
小測試與用Cython(因爲沒有timeit,不會出現與%%cython
環境:)
原始版本的工作:
import numpy as np
B = np.random.randint(-100,100,size=100000)
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
import time
measurements = np.zeros(100, dtype='float')
for i in range(measurements.size):
a = time.time()
max_subarray(B)
measurements[i] = time.time() - a
print 'non-c:', measurements.min(), measurements.max(), measurements.mean()
用Cython版本:
%%cython
import numpy as np
cimport numpy as np
B = np.random.randint(-100,100,size=100000)
DTYPE = np.int
ctypedef np.int_t DTYPE_t
cdef DTYPE_t c_max_subarray(np.ndarray A):
# Type checking for safety
assert A.dtype == DTYPE
cdef DTYPE_t max_so_far = 0, max_ending_here = 0, x = 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
import time
measurements = np.zeros(100, dtype='float')
for i in range(measurements.size):
a = time.time()
c_max_subarray(B)
measurements[i] = time.time() - a
print 'Cython:', measurements.min(), measurements.max(), measurements.mean()
結果:
- 用Cython:0.00420188903809 0.00658392906189 0.00474049091339
- 非C:0.0485298633575 0.0644249916077 0.0522959709167
絕對是一個顯着的增長沒有太多精力:)
你說的更好呢?更快?你可以明確地得到比純Python實現更快的速度。您可以使用Cython進行優化,將其寫入純C並通過'ctypes'或'Cython'包含它。 – cel
@cel是的,抱歉,如果我不清楚。更好=>更快。由於numpy數組已經是一種優化的數據類型(例如固定數據類型,連續數組等),我想知道是否有可以利用的(numpy)內置操作。因爲我不熟悉Cython路線,所以我沒有想過。 – Hooked
你只是希望它快速執行還是執行時間複雜度高?簡單地做一個'cumsum'和一個'sort'在numpy中將會非常快,無論:) – Wolph