2014-12-01 1 views
0

Я хочу, чтобы произвести i,j вектор, где каждый i сочетается с каждым j, простой вариант кода будет следующим образом:быстрый вещий способ производства I, J комбинации

n = 5 
m = 3 

for i in range(n): 
    for j in range(m): 
     print str(i) + ',' + str(j) 

В РЕЗУЛЬТАТЕ:

0,0 
0,1 
0,2 
1,0 
1,1 
1,2 
2,0 
2,1 
2,2 
3,0 
3,1 
3,2 
4,0 
4,1 
4,2 

Однако, если n is 8e6 и m is 200 (как в моем случае) эта петля вложенности становится очень медленной.

  • Есть ли несколько способов для получения этой комбинации в C-подобной скорости?
  • Есть ли другой способ?

Заранее спасибо.

+0

Где вы хотите этот вывод будет перенаправлен? В файл, pipe, std? – Beri

+1

'для i, j в itertools.product (xrange (n), xrange (m)):' более аккуратно и не позволяет построить весь список чисел. – jonrsharpe

+1

Кроме того, проверьте [декартово произведение больших итераторов] (http://stackoverflow.com/questions/12093364/cartesian-product-of-large-iterators-itertools) – fredtantini

ответ

2

Используйте itertools.product, чтобы произвести декартовое изделие.

from itertools import product 
list(product(xrange(5), xrange(3))) 

[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2), (3, 0), (3, 1), (3, 2), (4, 0), (4, 1), (4, 2)] 

In [13]: %timeit list(product(xrange(5), xrange(3))) 
100000 loops, best of 3: 1.98 µs per loop 

Ваш подход: -

for i in range(5): 
    for j in range(3): 
     print str(i) + ',' + str(j) 

100000 loops, best of 3: 7.33 µs per loop 

Itertools.product даже быстрее, чем generator функции (значительное время deiffrence).

def solve(): 
    a = ((i,j) for i in xrange(5) for j in xrange(3)) 
    for i in a: 
     print i 

In [10]: %timeit solve() 
100000 loops, best of 3: 3.25 µs per loop 
+0

Что именно вы сравнивали? В вашем первом примере нет операторов 'print', ваш второй пример содержит конкатенацию строк и один' print' за цикл ... –

+0

@TimPietzcker ohh! Сначала я использовал простоя, поэтому 'print', и я просто пытаюсь увидеть разницу между OP-подходом и использованием' itertools'. –

3

Вы можете использовать генератор:

g = ((i,j) for i in xrange(5) for j in xrange(3)) 
for tup in g: 
    print str(tup[0]) + ',' + str(tup[1]) 

 Смежные вопросы

  • Нет связанных вопросов^_^