繁体   English   中英

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

[英]alternative (faster) war to 3 nested for loop 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

您可以尝试查看itertools.product

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

嵌套循环像里程表一样循环,最右边的元素在每次迭代时前进。 此模式创建了一个词典排序,以便在输入的可迭代内容进行排序时,产品元组按排序顺序发出。

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

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

import itertools

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

你说你希望它更快。 让我们用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语言实现,所以非常非常快 - 如果输入值有些大,这可能很重要。

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

在Python 3中, range就像Python 2的xrange

import numpy

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM