有人告诉我,如果你在 python 中循环,你就做错了什么,我倾向于同意这一点,所以我做了一些性能。对我的程序进行分析,结果令我感到惊讶:
我正在尝试使用 dropna() 检索 pandas 系列的非 Nan 数据的索引,它似乎比循环慢:
from pandas import Series
import numpy as np
import timeit
def test1():
s = Series([25.9,25.8,np.nan,34.8],index=['a','b','c','d'])
return s.dropna().index
def test2():
s = Series([25.9,25.8,np.nan,34.8],index=['a','b','c','d'])
res = []
for i in s.index:
if not np.isnan(s[i]):
res.append(i)
return res
>>> timeit.timeit(test1,number=10000)
1.931797840017623
>>> timeit.timeit(test2,number=10000)
1.602180508842423
我在这里遗漏了什么吗?或者只是因为我返回一个数组而不是 pandas 索引?
提前致谢
最佳答案
这些是非常小系列。尝试使用更大的:
In [11]: s = pd.Series([25.9,25.8,np.nan,34.8] * 1000)
In [12]: %timeit [i for i in s.index if not np.isnan(s[i])]
10 loops, best of 3: 34.9 ms per loop
In [13]: %timeit s.dropna().index
10000 loops, best of 3: 106 µs per loop
注意:我使用了列表理解,它可能比您的实现稍快。
关于Python Pandas 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22191176/