在C中而不是在Python itertools.combinations中获取组合



切换到C是一种比Python更快地获得组合的合适方法吗?还是我走错了路I only";说";python,并希望得到一些指导来决定我自己选择的学习项目的下一步编程步骤。我正在进行一个数据科学项目,根据你的回答,我建议邀请一位计算机科学家参与该项目,或者放弃我的项目方法。

我有一个69个字符串的列表,其中我需要8个元素的所有可能组合。目前,我可以用itertools.combinations((在python中完成这项工作

for i in itertools.combinations(DictAthleteObjects.keys()),8):
do stuff here on instances of classes

在Python中,itertools.combinations对视图组合非常适用,但由于组合量大,它的时间效率不高,有时在视图迭代后不中断循环时会崩溃(我认为是因为内存太少(。一般来说,时间复杂性非常大。

根据StackOverflow的讨论,它可能是一种有效的方法,可以在C中生成组合,也可以在C中执行python中的所有编程,因为它要快得多。

另一方面,我收到了一条评论,说itertools.combinations正在使用C本身。但我找不到任何消息来源。

到目前为止,您收到的评论基本上回答了您的问题(评测、大量C麻烦的小收获、代码重新设计(,但在过去的几天里,我在一个家庭项目中遇到了类似的困境,我想谈谈我的想法。

在评测方面,我只是在程序运行时使用Python的时间模块和全局启动时间变量来获得基本的基准测试。对于高度复杂的场景,我建议使用注释中提到的Python评测器。

import time
start_time = time.process_time()
// stuff
print(f'runtime(sec): {time.process_time() - start_time}')

这使我能够获得10000英尺的视图,了解我的代码做各种事情所需的时间,然后我找到了一个可行的输入数据大小,它运行时间不长,但很好地代表了更大的数据集,并试图进行增量改进。

经过一番折腾,我发现需要做的最昂贵的事情是什么,而最重要的是生成这些独特的组合。因此,我最终所做的是将事情分解成各种管道,使我能够将总运行时间减少到执行最昂贵的工作所需的时间。

在itertools.combinations的情况下,它实际上并没有生成真正的输出值,所以它运行得非常快,但当需要执行for循环并实际生成这些值时,事情会变得有趣。在我的机器上,发电机大约需要3毫秒才能返回,如果我绕过它,它将产生大约31.2B个组合。

# Code to check how long itertools.combinations() takes to run
import itertools
import time
data = []
for i in range(250000):
data.append(i)
ncombos = (250000 * 249999) / 2
for num_items in range(2, 9):
start_time = time.process_time()
g = itertools.combinations(data, num_items)
print(f'combo_sz:{num_items} num_combos:{ncombos} elapsed(sec):{time.process_time() - start_time}')

在我的案例中,我找不到一种方法来很好地将生成器分解为多个部分,所以我决定使用多处理模块(Process、Queue、Lock(来传递数据(这也节省了大量内存(。总之,从子任务的角度来看确实很有帮助,因为每个子任务可能需要不同的东西。

也不要像我一样,过快地浏览文档哈哈,很多问题都可以通过阅读这些东西来解决。我希望你从这个回复中发现一些有用的东西,祝你好运!

最新更新