我正在通过itertools创建的生成器对事物的排列进行计算。我有这种形式的一段代码(这是一个虚拟的示例):
import itertools
import pandas as pd
combos = itertools.permutations('abcdefghi',2)
results = []
i=0
for combo in combos:
i+=1 #this line is actually other stuff that's expensive
results.append([combo[0]+'-'+combo[1],i])
rdf = pd.DataFrame(results, columns=['combo','value'])
除真实代码外,
i+=1
而是打开文件并获取clf.predict
的结果,其中clf
是经过scikit-learn训练的分类器i
来存储该预测的值我认为combo[0]+'-'+combo[1]
无关紧要。
这花费了太长时间。我应该怎么做才能使其更快?如:
1)编写更好的代码(也许我应该使用适当的长度初始化results
而不是使用append
,但这有什么帮助?当我不这样做时,最好的方法是什么?在遍历combs
之前知道长度吗?)
2)初始化熊猫数据框而不是列表,并使用apply
?
3)在熊猫中使用cython?总共新手。
4)parallelizing?我想我可能需要这样做,但是总的来说,这是新手,而且我不知道在列表中还是在熊猫数据框中这样做是否更好。我知道我需要遍历生成器并初始化某种容器before parallelizing。
这些选项的哪种组合最好,我如何将它们组合在一起?
答案 0 :(得分:-1)
熊猫中的append
操作和for
循环很慢。此代码避免使用它。
import itertools
import pandas as pd
combos = itertools.permutations('abcdefghi',2)
combo_values = [('-'.join(x[1]), x[0]) for x in enumerate(combos, 1)]
rdf = pd.DataFrame({'combos': [x[0] for x in combo_values],
'value': [x[1] for x in combo_values]})
您可以对每个文件和数据框执行此操作,然后使用pd.concat快速生成结果。如果需要,还可以在以后添加排列的枚举。