对于python中的大型数据集,什么是最快的性能元组?

2024-05-15 20:56:36 发布

您现在位置:Python中文网/ 问答频道 /正文

现在,我基本上正在运行一个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本字典,听起来很复杂。。虽然可能不是。。我不确定,也许那样会更好,这似乎不管用。在

我需要一个字符串来显示每个值,每个值之间有一个逗号。这就是为什么我现在在做弦的事情。在


Tags: 方法字符串name名称字典时间etc名字
3条回答

有许多因素可能会导致程序运行缓慢。在

当与大字符串一起使用时,String concatenation in python的效率非常低。在

Strings in Python are immutable. This fact frequently sneaks up and bites novice Python programmers on the rump. Immutability confers some advantages and disadvantages. In the plus column, strings can be used as keys in dictionaries and individual copies can be shared among multiple variable bindings. (Python automatically shares one- and two-character strings.) In the minus column, you can't say something like, "change all the 'a's to 'b's" in any given string. Instead, you have to create a new string with the desired properties. This continual copying can lead to significant inefficiencies in Python programs.

考虑到示例中的每个字符串可能包含数千个字符,每次执行串联操作时,python都必须将这个巨大的字符串复制到内存中以创建一个新对象。在

这样会更有效率:

strings = []
strings.append('string')
strings.append('other_string')
...
','.join(strings)

在您的例子中,它应该存储一个列表,而不是每个字典键存储一个大字符串,您只需将每个匹配项附加到列表中,并且只有在末尾使用str.join进行字符串连接。在

另外,printing to stdout is also notoriously slow。如果要在50000项循环的每次迭代中打印到stdout,则每次迭代都会被无缓冲写入stdout所阻碍。考虑只打印每个nth迭代,或者改为写入一个文件(文件写入通常是缓冲的),然后从另一个终端拖尾该文件。在

这个答案是基于OP对我的评论的回答。我问他会用dict做什么,暗示也许他一开始就不需要构建它。@西蒙回答:

i add it to an excel sheet, so I take the KEY, which is the name, and put it in A1, then I take the VALUE, which is 1345,345,135,346,3451,35.. etc etc, and put that into A2. then I do the rest of my programming with that information...... but i need those values seperated by commas and acessible inside that excel sheet like that!

所以看起来dict根本不需要构建。这里有一个替代方法:为每个名称创建一个文件,并将这些文件存储在^{中:

files = {}
name = 'John'  # let's say
if name not in files:
    files[name] = open(name, 'w')

然后,当您在50k行的excel上循环时,您可以执行如下操作(伪代码):

^{pr2}$

由于您的value_string已经用逗号分隔,所以您的文件将是csv格式的,而不会对您的部分进行任何进一步的调整(除了您可能希望在完成后去掉最后一个逗号)。然后当您需要John的值时,只需value = open('John').read()。在

现在我从未使用过50k row excels,但是如果这不是比您现在的速度快一点,我会非常惊讶的。拥有持久性数据也是一个优点。在


编辑:

以上是一个面向内存的解决方案。写入文件比追加到列表慢得多(但可能比重新创建许多大字符串还要快)。但是如果列表很大(这看起来很可能),并且您遇到内存问题(不是说您会),您可以尝试使用文件方法。在

另一种方法,类似于性能列表(至少对于我尝试过的玩具测试)是使用StringIO

from io import StringIO  # python 2: import StringIO import StringIO

string_ios = {'John': StringIO()}  # a dict to store StringIO objects
for value in ['ab', 'cd', 'ef']:
    string_ios['John'].write(value + ',')
print(string_ios['John'].getvalue())

这将输出'ab,cd,ef,'

不要构建一个看起来像列表的字符串,而是使用一个实际的列表,并在完成后生成所需的字符串表示形式。在

相关问题 更多 >