python - 巨大的for循环是缓慢的,有更快的方法来处理它

时间:2018-02-15 09:06:23

标签: python arrays numpy bigdata

我正在运行大量关于10-15 mil的数据。在for循环中乘以倍数,我可以从它的for循环中找到缓慢的例如。

当我测试100行,然后是1000行然后每行25.000行时,我解决了这个问题,每次我对行数进行处理时,它需要花费更长的时间才能运行。

我今天正在使用numpy来计算大量的价格和它的工作完美,所以现在我用这么多的数据撞到墙上关闭运行多次重组数据然后我准备将它返回到最后阵列/字典。

当我在for循环中运行for时,它会发出更多的时间,然后花费更多的时间来运行forc我需要运行“for 1 rows * for 2 rows”

我的情况是。

  1. 1.200.000产品
    1. 价格规则可以打(25-30差价规则)
    2. 选择合适的价格规则并根据htis规则执行操作
    3. 在使用numpy之前使用for循环重新构造数据
    4. 使用numpy计算主要产品价格的价格
  2. 运行产品价格组,为每种产品生成10-15个价格组
    1. 在使用numpy之前重新构造数据并准备for循环
    2. 将价格附加到for循环的主要产品价格数组
  3. 重新构造所有数据,并准备在我的数组/字典中返回它,以便我以后可以使用它(单/多产品计算)
  4. 希望你理解我想要的东西,以及为什么这需要花费很多时间,并希望有一个可以帮助我找到更快的方法来计算如此多的数据。

    我考虑过多线程选项,但我认为在进入下一个性能设置之前我需要修复主回路问题

    我案例的一个非常基本的示例如何在循环地狱中点击此循环

    import datetime
    start_time = datetime.datetime.now()
    
    product = []
    group = []
    final_collect = []
    
    for test_product in range(25000):
        product.append({'title': test_product})
    
    for (inx, item) in enumerate(product):
        group.append({
            'product' : item,
            'group-data' : []
        })
    
        for test_group in range(10):
            group[inx]['group-data'].append({'group' : test_group, 'price' : 100.0})
            print(inx, test_group)
    

    正如你所看到的那样,当我们说出25.000个产品时,如果我们以1.200.000 mil的速度运行它,那么运行250.000个循环需要大约2-3秒。 * 10分组其每个12.000.000循环,我做它倍增时间,所以它将需要很长时间。但关于这个问题的关闭是否更快?

1 个答案:

答案 0 :(得分:1)

下面的

run2与同等run1(您提供的)相比,可提高30%。输出完全相同。

虽然这可能不是“即插即用”的用例,但它演示了一些可用于提高性能的技巧。

import datetime

def run1(n):
    start_time = datetime.datetime.now()

    product = []
    group = []
    final_collect = []

    for test_product in range(n):
        product.append({'title': test_product})

    for (inx, item) in enumerate(product):
        group.append({'product': item,
                      'group-data': []})

        for test_group in range(10):
            group[inx]['group-data'].append({'group': test_group, 'price': 100.0})

    return group

def run2(n):
    start_time = datetime.datetime.now()

    group = [{'product': {'title': i},
              'group-data': [{'group': test_group, 'price': 100.0} for test_group in range(10)]} \
              for i in range(n)]

    return group

assert run1(10) == run2(10)

%timeit run1(50000)  # 1 loop, best of 3: 372 ms per loop
%timeit run2(50000)  # 1 loop, best of 3: 260 ms per loop