Python 使用%%timeit、循环速度或总运行时间测试性能更重要?

Python 使用%%timeit、循环速度或总运行时间测试性能更重要?,python,pandas,numpy,Python,Pandas,Numpy,我对10k-100k行的csv文件进行了数百万次迭代,因此性能至关重要。我将一行一行地优化每一行,压缩每一秒的时间。这很简单,只需克隆一个数据帧系列。目前与这些初步结果相混淆 @numba.jit() def测试(x): 返回x #%%时间 df['source']=df['Close'] #每个回路79.5µs±3.58µs(7次运行的平均值±标准偏差,每个10000个回路) #%%时间 df['source2']=test(df['Close'].to_numpy()) #每个回路88.1µ

我对10k-100k行的csv文件进行了数百万次迭代,因此性能至关重要。我将一行一行地优化每一行,压缩每一秒的时间。这很简单,只需克隆一个数据帧系列。目前与这些初步结果相混淆

@numba.jit()
def测试(x):
返回x
#%%时间
df['source']=df['Close']
#每个回路79.5µs±3.58µs(7次运行的平均值±标准偏差,每个10000个回路)
#%%时间
df['source2']=test(df['Close'].to_numpy())
#每个回路88.1µs±683 ns(7次运行的平均值±标准偏差,每个10000个回路)
第一个循环的总运行时间更快,但第二个循环的每循环时间更快。如果每循环速度更快,我希望总体速度更快

这是否意味着在后端使用的时间要多得多?有人能给我解释一下吗

我应该更重视总运行时间还是每循环时间


注意,我正在Anaconda上使用Jupyter笔记本。

我只能想到一件事,总时间和迭代时间是不同的。这是垃圾收集。Python的垃圾收集器会不时检查哪些变量不再使用,并为它们释放内存。如果你运行一个循环,你可能永远不会看到它工作。但如果它运行的时间比最有可能的时间长,它就会被触发并开始释放内存,这需要时间。因此,如果在循环期间分配了更多内存,垃圾收集器需要更多的时间来释放内存

这种想法会给您的代码带来一种可能的改进:
注意你分配了多少内存

df['source']=df['Close']
可能意味着将数据从一列复制到另一列。尽量重复使用数据。例如,执行
col1=df['Close']
,然后使用
col1
进行进一步操作。这样,数据就不会被复制,而且速度更快(如果您不需要列
源代码
并且它是临时使用的)

还有一种可能是通过不分配和取消分配内存来加快速度。使用Numba时,一次迭代所有行并进行计算比使用Numpy/Pandas的向量公式多次迭代相同数据更快。您不仅可以多次迭代数据,还可以使用堆栈变量而不是堆(术语仅与编译代码相关。Python将所有内容存储在堆中)。通过在Numba中使用堆栈变量,您基本上停止了不断地分配和释放内存


另一种选择是在大循环之前预先分配变量,并在循环的每次迭代中重用它们。但这只有在每次迭代都有稳定的可变大小时才有帮助(在您的情况下,意味着每个CSV文件的行数)

输出中的总运行时间在哪里?您可能会混淆措辞吗。它是每个回路的“79.5µs±3.58µs”,而不是总的79.5µs和每个回路的3.58µs。您看到的是,第二个循环的速度变化较小,但速度仍然较慢。
79.5µs±3.58µs/循环
意味着平均需要79.5微秒,标准偏差为3.58微秒。这意味着约65%的跑步时间间隔在76到83微秒之间。另一方面,
88.1µs±683 ns
意味着平均值为88.1微秒,标准偏差为683纳秒,约65%的试验在87.4到88.8微秒之间。这意味着在平均值大致相同的情况下,numba通过的次数要一致得多。您是否也可以公布循环的总次数?我将你发布的时间解释为循环时间。或者只是解释一下你所说的每循环次数和总次数。@ALollz。马克,是的,我误解了。这并不能真正回答问题,因为总时间没有报告。OP只是把圣路易斯弄糊涂了。dev@user1558604OP表示总时间与循环时间不一致。我解释说他说的是平均数,而不是标准差。这里解释的原因是我能想到的唯一一个可以解释为什么总时间更小,但与其他替代方案相比,循环时间更大。他从来没有在问题中提到过圣戴夫。问题中的泰晤士报是循环时间。没有发布总时间,帖子上的评论似乎表明OP将标准偏差误解为循环时间,而事实并非如此。