gpt4 book ai didi

python - 加快与 Cython 的日期时间比较

转载 作者:太空狗 更新时间:2023-10-29 21:59:31 25 4
gpt4 key购买 nike

当传递一个 numpy 日期时间数组(或足以创建日期时间的详细信息)时,我正在尝试使用 Cython 加快日期时间之间的比较。首先,我试图了解 Cython 将如何加速整数之间的比较。

testArrayInt = np.load("testArray.npy")

Python 方法:

def processInt(array):
compareSuccess = 0#number that is greater than
testValue = 1#value to compare against
for counter in range(testArrayInt.shape[0]):
if testValue > testArrayInt[counter]:
compareSuccess+=1
print compareSuccess

赛通方法:

def processInt(np.ndarray[np.int_t,ndim=1] array):
cdef int rows = array.shape[0]
cdef int counter = 0
cdef int compareSuccess = 0
for counter in range(rows):
if testInt > array[counter]:
compareSuccess = compareSuccess+1
print compareSuccess

与第 1000000 行的 numpy 数组的时间比较是:

Python: 0.204969 seconds
Cython: 0.000826 seconds
Speedup: 250 times approx.

用日期时间重复同样的练习:由于 cython 不接受日期时间数组,我拆分并向这两种方法发送了一个年月日数组。

testArrayDateTime = np.load("testArrayDateTime.npy")

Python 代码:

def processDateTime(array):
compareSuccess = 0
d = datetime(2009,1,1)#test datetime used to compare
rows = array.shape[0]
for counter in range(rows):
dTest = datetime(array[counter][0],array[counter][1],array[counter][2])
if d>dTest:
compareSuccess+=1
print compareSuccess

赛通代码:

from cpython.datetime cimport date

def processDateTime(np.ndarray[np.int_t, ndim=2] array):
cdef int compareSuccess = 0
cdef int rows = avlDates.shape[0]
cdef int counter = 0
for counter in range(rows):
dTest = date(array[counter,0],array[counter,1],array[counter,2])
if dTest>d:
compareSuccess=compareSuccess+1
print compareSuccess

性能:

Python: 0.865261 seconds
Cython: 0.162297 seconds
Speedup: 5 times approx.

为什么加速比这么低?增加它的可能方法是什么?

最佳答案

您正在为每一行创建一个 date 对象。这需要更多时间,既因为您必须分配和释放内存,也因为它对参数运行各种检查以确保它是有效日期。

为了更快地进行比较,可以使用整数比较来比较 np.datetime64 数组,也可以将年、月和日列分别作为整数进行比较。

关于python - 加快与 Cython 的日期时间比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33163702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com