当数据有点大时,Pythonfor循环的速度会越来越慢

当数据有点大时,Pythonfor循环的速度会越来越慢,python,Python,我想在数据集中相互比较。数据集是一个列表,有20000个成员,那么我的代码如下: >>index = 0 >>for i in all: index += 1 begin_time = time.time() for j in all[index:]: ... here are some data processing,then make comparison, ...

我想在数据集中相互比较。数据集是一个列表,有20000个成员,那么我的代码如下:

>>index = 0
>>for i in all:
      index += 1
      begin_time = time.time()
      for j in all[index:]:
           ...
           here are some data processing,then make comparison,
           ...
           print time.time()-begin_time
然后它会随着时间变慢,开始时每个循环需要0.1秒,半小时后,每个循环大约需要1秒。 有人说这是由于垃圾收集造成的,但当我在操作之前添加gc.disable()时,情况仍然没有好转。 谁能告诉我该怎么做?

你的算法是
O(n^2)
,这很糟糕。 如果可能的话,考虑改变算法。

也可以考虑使用<代码>迭代器< /代码>代替手动组合处理。 它将更具可读性,并且可能比您的方法更有效:

import itertools
for i,j in itertools.product(all, all):
  print i,j

gc.disable()
只会让事情变得更糟!您是否尝试过
gc.enable()
;)。我们需要了解数据处理部分。将数组中的每个元素与之前的所有元素进行比较至少需要O(N^2)个时间。内部循环逐渐变慢几乎是不可避免的。@Kevin:与之前的所有元素相比
all[index://code>实际上会生成一个包含所有后续元素的列表,因此它应该会更快@腾腾格尝试分析执行情况,保持
iostat-x2
运行或
top
。检查处理器状态,如果是iowait,内存使用率没有增加,那么这就是I/O瓶颈,正如Veedrac所建议的那样。实际上,我的算法非常慢,但我真的找不到更好的方法。因为我需要找出数据集中所有相似的数据,而这些数据无法排序以减少比较时间。但是为什么它会随着时间的推移而变慢呢?从代码的角度来看,它应该变得更快,因为第一个数据需要比较N次,而第二个数据只需要比较N-1次。尽管看到您是如何进行数据分析的,但是像pandas这样的专业库可能会更有效率。我同意你的观点,你的方法不应该变慢。但一定要试试itertools.product,并让我们知道。好的,我会试试。这是一条评论:“对我来说,这里的问题是内存。切片会创建新的实例。因此,吃掉大约20k*20k-20k‘项’的内存。”——保罗·卡斯切洛1小时前,“我认为切片将是暂时的,不会在内存中存在很长时间,不是吗?所以这不是原因?我同意你的观点,它不应该在记忆中存在太久。无论如何,你应该使用itertools而不是手动索引项。我已经找到了原因,我在函数中犯了一些简单的错误。这与他们的猜测无关,但我认为你的建议很好,谢谢