现在,我基本上正在运行一个excel表格。在
我有大约20个名字,然后我有50k个总值,与这20个名字中的一个匹配,所以excel表格有50k行长,B列显示任意随机值,A列显示20个名称中的一个。在
我试图为每个显示所有值的名称获取一个字符串。在
Name A: 123,244,123,523,123,5523,12505,142... etc etc.
Name B: 123,244,123,523,123,5523,12505,142... etc etc.
现在,我创建了一个在excel表中运行的字典,检查字典中的名称是否都准备好了,如果是,那么它将执行一个
^{pr2}$然后它将strA重新插入到字典中该特定名称。如果名称不存在,它将创建字典键,然后将该值添加到它。在
现在,一开始还不错。。但这已经有15或20分钟了,到目前为止,它只增加了5k的值,随着时间的推移,它似乎变得越来越慢,而且它一直在运行。在
我想知道有没有更好的方法或者更快的方法。我在考虑每1k值建立一个新的字典,然后在最后将它们组合在一起。。但总共有50本字典,听起来很复杂。。虽然可能不是。。我不确定,也许那样会更好,这似乎不管用。在
我需要一个字符串来显示每个值,每个值之间有一个逗号。这就是为什么我现在在做弦的事情。在
有许多因素可能会导致程序运行缓慢。在
当与大字符串一起使用时,String concatenation in python的效率非常低。在
考虑到示例中的每个字符串可能包含数千个字符,每次执行串联操作时,python都必须将这个巨大的字符串复制到内存中以创建一个新对象。在
这样会更有效率:
在您的例子中,它应该存储一个列表,而不是每个字典键存储一个大字符串,您只需将每个匹配项附加到列表中,并且只有在末尾使用
str.join
进行字符串连接。在另外,printing to stdout is also notoriously slow。如果要在50000项循环的每次迭代中打印到stdout,则每次迭代都会被无缓冲写入stdout所阻碍。考虑只打印每个
nth
迭代,或者改为写入一个文件(文件写入通常是缓冲的),然后从另一个终端拖尾该文件。在这个答案是基于OP对我的评论的回答。我问他会用dict做什么,暗示也许他一开始就不需要构建它。@西蒙回答:
所以看起来dict根本不需要构建。这里有一个替代方法:为每个名称创建一个文件,并将这些文件存储在^{中:
然后,当您在50k行的excel上循环时,您可以执行如下操作(伪代码):
^{pr2}$由于您的
value_string
已经用逗号分隔,所以您的文件将是csv格式的,而不会对您的部分进行任何进一步的调整(除了您可能希望在完成后去掉最后一个逗号)。然后当您需要John的值时,只需value = open('John').read()
。在现在我从未使用过50k row excels,但是如果这不是比您现在的速度快一点,我会非常惊讶的。拥有持久性数据也是一个优点。在
编辑:
以上是一个面向内存的解决方案。写入文件比追加到列表慢得多(但可能比重新创建许多大字符串还要快)。但是如果列表很大(这看起来很可能),并且您遇到内存问题(不是说您会),您可以尝试使用文件方法。在
另一种方法,类似于性能列表(至少对于我尝试过的玩具测试)是使用
StringIO
:这将输出
'ab,cd,ef,'
不要构建一个看起来像列表的字符串,而是使用一个实际的列表,并在完成后生成所需的字符串表示形式。在
相关问题 更多 >
编程相关推荐