gpt4 book ai didi

python - IDLE 和命令行之间的性能差异。 IDLE 表现更好的地方

转载 作者:行者123 更新时间:2023-11-28 19:24:11 29 4
gpt4 key购买 nike

我有一个奇怪的问题。根据像this这样的帖子我希望 IDLE 比在命令行上运行我的代码慢。然而,我看到完全相反的情况。

该程序比较两个文件并将匹配行配对在一起并将所有匹配项写入新文件。我认为它类似于 SQL 中的连接。但我需要忽略没有匹配项的行。以下是程序功能的概述:

  • 程序读取一个大文件 ~1kb 并将每一行的键值对存储到字典中
  • 然后它开始读取另一个大文件 ~1kb。对于每一行,它都会测试字典中的键是否存在于新文件中。如果是这样,它会将这些对写入一个新文件。

程序似乎在尝试访问非常大的字典时卡住了。在 IDLE 下运行大约需要 2-3 分钟,但 1 小时后程序仍未在命令行上完成。当我访问 write_file 时,它​​的写入速度非常慢。

这是第一个文件的一些简化数据,其中数据由制表符分隔,数字是键,值是信息:

20\tinfo_first_file_20\n

18\tinfo_first_file_18\n

这是第二个文件的示例:

20\tinfo_second_file_20\n

30\tinfo_second_file_20\n

这是正在写入的文件的示例:

20\tinfo_first_file_20\t20\tinfo_second_file_20\n

函数

def pairer(file_1, file_2, write_file):
wf = open(write_file, 'w')
f1 = open(file_1, 'r')

line = f1.readline()
d = {}
while line != "":
key, value = line.strip('\n').split('\t')
d[key] = value
line = f1.readline()

f2 = open(file_2, 'r')
line_2 = f2.readline()

while line_2 != "":
key, value = line_2.strip('\n').split('\t')
if key in d.keys():
to_write = key +'\t' + d[key] + '\t' + key +'\t'+ value + '\n'
wf.write(to_write)
line_2 = f2.readline()

我如何在 IDLE 中运行代码

if __name__=="__main__":

pairer('file/location/of/file_1', 'file/location/of/file_2', 'file/location/of/write_file')

我如何在终端中运行代码

if __name__=="__main__":
parser = argparse.ArgumentParser()
parser.add_argument('file_1', action="store")
parser.add_argument('file_2', action="store")
parser.add_argument('write_file', action="store")
results = parser.parse_args()
pairer(results.file_1, results.file_2, results.write_file)

所有代码都是实际代码的简化。我希望我包含的内容足以让别人给我指出正确的方向,但不要太多,所以我要切中要点。我是编程新手,所以这可能是一个明显的问题,但我还没有找到任何东西。

使用终端时是否有字典的最大大小?它的存储方式是否不同,最终会耗尽我的内存力?

我有一台 Mac OSX 10.8。 Tkinter 已更新。我正在使用 python2.7。提前致谢。

编辑:

在程序到达这一点之前,它确实有大约 30 分钟的其他分析要做。但它只在这里失败。不确定这是否相关。另一部分只是将每个 ~30kb 的大文件分成 22 个较小的文件。这里不涉及字典,速度也差不多。所以我可以在更小的层面上处理数据。

编辑 2:

使用终端时内存清除是否不同?

我还注意到另一件事:当我查看 Activity Monitor 应用程序时,当我在 IDLE 中运行代码时,它似乎使用了更多的 CPU。我看起来它使用了不止一个处理器,但这没有意义。因为我的代码不是为并行运行而编写的。另外,当我在空闲状态下运行时,计算机会发出更多噪音。不是很定量,而是观察。

最佳答案

一个 1kb 的文件听起来很小,但这里有一些可能会解决问题的提示,因为这个问题有点含糊:

使用 argparse 意味着在命令行中你需要这样的东西:

python prog.py --file_1 file --file_2 file --write_file output

我不确定这是否是您想要的。您可以保持简单并执行以下操作:

if __name__ == '__main__':
file_1 = sys.argv[1]
file_2 = sys.argv[2]
write_file = sys.argv[3]
pairer(file_1, file_2, write_file)

你可以这样调用它:

python prog.py file_1 file_2 write_file

此外,这主要是一个样式问题,但我会稍微修改配对器 - 在文件上使用 for 循环,并且不要创建 keys() 列表。

def pairer(file_1, file_2, write_file):

d = {}
# using 'with' prevents lost resources!
with open(file_1, 'r') as f1:
for line in f1:
# no arguments in strip clears all whitespace
key, value = line.strip().split('\t')
d[key] = value

f2 = open(file_2, 'r')
line_2 = f2.readline()
with open(file_2, 'r') as f2, open(write_file, 'w') as wf:
key, value = line_2.strip().split('\t')
# don't do 'if key in d.keys()' because .keys() constructs a list of keys
# the in operator checks the key directly, which is O(1) instead of O(n)
# this should give you a pretty big speed boost
if key in d:
# this is probably a trivial speed difference, but you could try it this way:
to_write = '\t'.join([key, d[key], key, value + '\n'])
wf.write(to_write)

关于python - IDLE 和命令行之间的性能差异。 IDLE 表现更好的地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17073692/

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