【发布时间】:2019-08-22 13:28:53
【问题描述】:
我正在尝试创建一个循环遍历数组并创建新数组的函数。 Usint timeit 我发现最慢的部分是循环 numpy 数组。 由于我用作输入的数组往往很长,因此我想尽可能加快速度。
有没有办法让列表理解循环更快? 我提供了一个函数来重新创建我的问题:
def get_days(year, month):
months=np.array([31,28,31,30,31,30,31,31,30,31,30,31])
if month==2:
if (year%4==0 and year%100!=0) or (year%400==0):
return 29
return months[month-1]
这个数组需要产生更好的性能:
res=np.arange(20788, 20940)
np.array([np.min([x+datetime.fromtimestamp(20809*24*60*60).day-1, x+get_days(datetime.fromtimestamp(20809*24*60*60).year, datetime.fromtimestamp(20809*24*60*60).month)]) for x in res])
【问题讨论】:
-
请注意,
get_days的每次 调用都会分配一个新的months数组。将其移到get_days函数之外。还要检查对months使用常规数组而不是 numpy 数组是否有影响。 -
是的,它提高了一点循环速度。但是我想知道是否有某种映射或应用函数可以同时在列表上应用 np.min。
-
调用
datetime.fromtimestamp一次而不是三次也会有所帮助。 -
如果你唯一要做的就是索引一个列表,那么没有理由使用
numpy。 -
最大的优化就是去掉
get_days,内联代码;在 Python 中调用用户定义的函数相对昂贵。
标签: python performance numpy