在 Python 中,我们可以用很多种的方法来实现同样的目标,例如实现两个数组的相加:
- import numpy as np
- rng = np.random.RandomState(42)
- x = rng.rand(1E6)
- y = rng.rand(1E6)
- %timeit x + y
利用 Numpy 中的 fromiter 函数我们可以得到相同的一维数组,然而我们发现,这个语句的性能并不比内置的数组加法好。
- %timeit np.fromiter((xi + yi for xi, yi in zip(x, y)),
- dtype=x.dtype, count=len(x))
再比如,进行某一项条件的判断:
- mask = (x > 0.5) & (y < 0.5)
- tmp1 = (x > 0.5)
- tmp2 = (y < 0.5)
- mask = tmp1 & tmp2
- import numexpr
- mask_numexpr = numexpr.evaluate('(x > 0.5) & (y < 0.5)')
- np.allclose(mask, mask_numexpr)
面对同样的问题,Pandas 库为我们提供了更高性能的解决方案, eval 函数能够将特定形式的字符串转换为对应含义的逻辑判断或运算,比 Python 的内置函数具有更好的算法效率:
- import pandas as pd
- nrows, ncols = 100000, 100
- rng = np.random.RandomState(42)
- df1, df2, df3, df4 = (pd.DataFrame(rng.rand(nrows, ncols))
- for i in range(4))
- %timeit df1 + df2 + df3 + df4
- %timeit pd.eval('df1 + df2 + df3 + df4')
- np.allclose(df1 + df2 + df3 + df4,
- pd.eval('df1 + df2 + df3 + df4'))
可以看到,eval 函数实现了等价的计算,并且具有更高的性能。除了加法运算,Pandas 的函数 eval 还能帮助我们实现其他多种复杂的逻辑判断或计算:
以上内容转自 数析学院,更多关于 eval 函数的使用方法以及 query 函数的调用,可以直接查看原文


雷达卡






京公网安备 11010802022788号







