替代(更快)的战争到3嵌套的循环python

时间:2013-12-19 14:34:44

标签: python

如何更快地完成此功能? (我称之为很多时间,这可能会提高速度)

def vectorr(I,  J,  K):
    vect = []
    for k in range(0,  K):
        for j in range(0, J):
            for i in range(0, I):
                vect.append([i, j, k])
    return vect

4 个答案:

答案 0 :(得分:7)

您可以尝试查看itertools.product

  

等效于生成器表达式中的嵌套for循环。例如,   对于B中的y,product(A,B)返回与(x,y)中的x相同的返回值。

     

嵌套循环像具有最右边元素的里程表一样循环   在每次迭代中前进。这种模式创造了一个词典   排序,以便输入的iterables排序,产品   元组按排序顺序发出。

调用范围(0,I)等时也不需要0 - 只使用范围(I)

所以在你的情况下它可以是:

import itertools

def vectorr(I,  J,  K):
    return itertools.product(range(K), range(J), range(I))

答案 1 :(得分:2)

你说你希望它更快。让我们用NumPy!

import numpy as np

def vectorr(I, J, K):
    arr = np.empty((I*J*K, 3), int)
    arr[:,0] = np.tile(np.arange(I), J*K)
    arr[:,1] = np.tile(np.repeat(np.arange(J), I), K)
    arr[:,2] = np.repeat(np.arange(K), I*J)
    return arr

这里可能有更优雅的调整,但这是一个基本的平铺,可以得到相同的结果(但是作为2D数组而不是列表列表)。这个代码全部用C语言实现,所以非常非常快 - 如果输入值有些大,这可能很重要。

答案 2 :(得分:1)

其他答案更彻底,至少在这种情况下更好,但一般来说,如果您使用的是Python 2,并且对于I,J或K的大值,请使用xrange()而不是range()xrange提供类似生成器的对象,而不是构造列表,因此您不必为整个列表分配内存。

在Python 3中,range的工作方式与Python 2的xrange类似。

答案 3 :(得分:1)

import numpy

def vectorr(I,J,K):
   val = numpy.indices( (I,J,K))
   val.shape = (3,-1)
   return val.transpose() # or val.transpose().tolist()