Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有什么办法可以加快这一比较?_Python_Performance_Pandas - Fatal编程技术网

Python 有什么办法可以加快这一比较?

Python 有什么办法可以加快这一比较?,python,performance,pandas,Python,Performance,Pandas,我有一个数据库,它正在把一些奇怪的日志文件存储到pandas.DataFrame中,这样我就可以做一些统计分析了。由于日志是进程的快照,每隔5分钟读取一次,因此当我读取每个文件时,我将对照上一个文件中输入的数据检查新行,以查看它们是否与以前的进程相同(在这种情况下,我只更新现有记录上的时间)。它可以正常工作,但是当单个日志超过100000行时,速度会惊人地慢 当我分析性能时,很少有突出的地方,但它确实显示了在这个简单函数中花费的大量时间,它基本上是将一个系列与上一个日志中的行进行比较: def

我有一个数据库,它正在把一些奇怪的日志文件存储到pandas.DataFrame中,这样我就可以做一些统计分析了。由于日志是进程的快照,每隔5分钟读取一次,因此当我读取每个文件时,我将对照上一个文件中输入的数据检查新行,以查看它们是否与以前的进程相同(在这种情况下,我只更新现有记录上的时间)。它可以正常工作,但是当单个日志超过100000行时,速度会惊人地慢

当我分析性能时,很少有突出的地方,但它确实显示了在这个简单函数中花费的大量时间,它基本上是将一个系列与上一个日志中的行进行比较:

def carryover(s,df,ids):
    # see if pd.Series (s) matches any rows in pd.DataFrame (df) from the given indices (ids)
    for id in ids:
        r = df.iloc[id]
        if (r['a']==s['a'] and
            r['b']==s['b'] and
            r['c']==s['c'] and
            r['d']==s['d'] and
            r['e']==s['e'] and
            r['f']==s['f'] ):
            return id
    return None
我认为这是非常有效的,因为
都短路了,而且所有的。。。但是有没有更好的办法


否则,我还可以做其他事情来帮助它跑得更快吗?产生的数据帧应该适合RAM,但我不知道是否有我应该设置的东西,以确保缓存等是最佳的。谢谢大家

像这样迭代和查找非常慢(即使会短路),速度很可能取决于它击中s的可能性有多大

一种更为“numpy”的方法是对整个阵列执行此计算:

equals_s = df.loc[ids, ['a', 'b', 'c', 'd', 'e', 'f']] == s.loc['a', 'b', 'c', 'd', 'e', 'f']
row_equals_s = equals_s.all(axis=1)
那么第一个为真的索引是
idxmax

row_equals_s.idxmax()
如果速度很关键,短路很重要,那么可以考虑在numpy阵列上迭代快速

谢谢,安迪——我对“numpy做事方式”很陌生(我想我需要从功能上考虑!),所以我一定要测试一下这个想法。我对cython更不熟悉,可能也会研究一下。(我还意识到还有一些常见的Python优化,我在代码的其余部分也没有做过。)