gpt4 book ai didi

python - 我怎样才能让这个Python文件扫描得更快?

转载 作者:行者123 更新时间:2023-12-01 04:47:55 24 4
gpt4 key购买 nike

编辑:Python 2.7.8

我有两个文件。 p_m 有几百条记录,其中包含第 2 列中的可接受值。p_t 有数千万条记录,我想确保其中第 14 列来自已经提到的可接受值集合。因此,在第一个 while 循环中,我读取所有可接受的值,制作一个集合(用于重复数据删除),然后将该集合转换为列表(我没有进行基准测试来查看集合是否会比实际上是一个列表......)。我在第二个循环中将其减少到尽可能少的行,但我不知道它们是否是最快的几行(我使用 [14] 索引两次,因为异常非常罕见,所以我没有'不想为变量赋值而烦恼)。目前,扫描大约需要 40 分钟。关于如何改进的任何想法?

def contentScan(p_m,p_t):
""" """
vcont=sets.Set()

i=0
h = open(p_m,"rb")
while(True):
line = h.readline()
if not line:
break
i += 1
vcont.add(line.split("|")[2])
h.close()

vcont = list(vcont)
vcont.sort()

i=0
h = open(p_t,"rb")
while(True):
line = h.readline()
if not line:
break
i += 1
if line.split("|")[14] not in vcont:
print "%s is not defined in the matrix." %line.split("|")[14]
return 1
h.close()

print "PASS All variable_content_id values exist in the matrix." %rem
return 0

最佳答案

检查包含数百个项目的集合中的成员资格比检查等效列表中的成员资格快得多。然而,考虑到您惊人的 40 分钟运行时间,差异可能并没有那么有意义。例如:

ozone:~ alex$ python -mtimeit -s'a=list(range(300))' '150 in a'
100000 loops, best of 3: 3.56 usec per loop
ozone:~ alex$ python -mtimeit -s'a=set(range(300))' '150 in a'
10000000 loops, best of 3: 0.0789 usec per loop

因此,如果您要检查“数千万次”,使用该集合应该可以节省数十秒——总比没有好,但几乎无法衡量。

同样的考虑也适用于其他非常可取的改进,例如改变循环结构:

h = open(p_t,"rb")
while(True):
line = h.readline()
if not line:
break
...
h.close()

变得更加时尚:

with open(p_t, 'rb') as h:
for line in h:
...

同样,每次迭代不会为您节省一微秒——因此,比方说,超过 5000 万行,这还不到 40 分钟中的一分钟。删除完全未使用的 i += 1 也是如此 - 它在那里没有任何意义,但采取它的方式不会有什么区别。

一个答案集中在split操作的成本上。这取决于每条记录有多少个字段,但是,例如:

ozone:~ alex$ python -mtimeit -s'a="xyz|"*20' 'a.split("|")[14]'
1000000 loops, best of 3: 1.81 usec per loop

所以,再次强调,这里的任何优化可能每次迭代最多可以节省一微秒——如果是这样的话,又可以节省一分钟。

实际上,这里的关键问题是为什么读取和检查例如 5000 万条记录每行需要花费 40 分钟 - 2400 秒 - 48 微秒;毫无疑问,即使进行了此处以及其他答案和评论中提到的所有优化,每行仍然超过 40 微秒。

因此,一旦您应用了所有优化(并确认代码仍然太慢),请尝试对程序进行分析 - 例如 http://ymichael.com/2014/03/08/profiling-python-with-cprofile.html -- 准确找出所有时间都去哪儿了。

此外,为了确保它不仅仅是某些特别慢的磁盘的 I/O,请使用“注释掉”的大循环的重要部分进行运行 - 只是读取大文件,并且不进行任何处理或检查一切都在它上面;这将告诉您“不可减少的”I/O 开销是多少(如果 I/O 占用了您大部分时间,那么您无法做太多改进,尽管将 open 更改为 open(thefile ,'rb',HUGE_BUFFER_SIZE)可能会有所帮助),并且可能需要考虑改进硬件设置 - 对磁盘进行碎片整理,使用本地而不是远程文件系统,等等......

关于python - 我怎样才能让这个Python文件扫描得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29036612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com