您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

何时使用DataFrame.eval()与pandas.eval()或python eval()

何时使用DataFrame.eval()与pandas.eval()或python eval()

那么DataFrame.eval()的好处仅仅是在简化输入方面,还是我们可以确定使用此方法实际上更快的情况?

DataFrame.eval()的源代码表明,它实际上只是创建要传递给pd.eval()的参数:

def eval(self, expr, inplace=None, **kwargs):

    inplace = validate_bool_kwarg(inplace, 'inplace')
    resolvers = kwargs.pop('resolvers', None)
    kwargs['level'] = kwargs.pop('level', 0) + 1
    if resolvers is None:
        index_resolvers = self._get_index_resolvers()
        resolvers = dict(self.iteritems()), index_resolvers
    if 'target' not in kwargs:
        kwargs['target'] = self
    kwargs['resolvers'] = kwargs.get('resolvers', ()) + tuple(resolvers)
    return _eval(expr, inplace=inplace, **kwargs)

其中_eval()只是pd.eval()的别名,该别名在模块的开头导入:

from pandas.core.computation.eval import eval as _eval

所以,什么可以做用df.eval(),你 可以pd.eval()+一些额外的线条处理事情。从目前的情况来看,df.eval()从没有严格比快pd.eval()。但这并不意味着在任何情况下都不会df.eval()像一样好pd.eval(),但是编写起来更方便。

但是,在玩弄%prun魔术之后,似乎通过bydf.eval()进行的调用df._get_index_resolvers()给该df.eval()方法增加了相当多的时间。最终,_get_index_resolvers()最终调用.copy()方法numpy.ndarray,这最终使事情变慢。同时,pd.eval()确实会numpy.ndarray.copy()在某个时候进行呼叫,但是所花费的时间可以忽略不计(至少在我的机器上)。

长话短说,似乎df.eval()pd.eval()在引擎盖下要慢得多,因为它只是pd.eval()在幕后加了一些额外的步骤,而这些步骤是不平凡的。

python 2022/1/1 18:32:36 有202人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶