Python 巨蟒熊猫表演

Python 巨蟒熊猫表演,python,performance,pandas,Python,Performance,Pandas,有人告诉我,如果你在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'])

有人告诉我,如果你在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

我是不是遗漏了什么?或者只是因为我返回的是数组而不是索引


提前感谢

这些是非常小的系列。试试大一点的:

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

注意:我使用了列表理解,它可能比你的impl略快。

这些是非常小的系列。试试大一点的:

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

注意:我使用了列表理解,这可能比你的解释要快一些。

虽然熊猫使徒们不会同意,但熊猫并不是所有问题的答案。始终选择最适合工作的工具,不要相信任何人说“library XYZ是所有东西的最佳工具”或“如果你是X'ing,你做错了什么”。在引擎盖下,你的图书馆又在X'ing了。虽然熊猫使徒们不会同意,但熊猫不是一切的答案。始终选择最适合工作的工具,不要相信任何人说“library XYZ是所有东西的最佳工具”或“如果你是X'ing,你做错了什么”。在引擎盖下,你的图书馆又在X'ing了。