2015-07-05 3 views
-3

У меня есть длинный список x и y, содержащий около 1000 элементов с номерами ~10^6. Я создаю массив массивов массивов 1000x1000 со списком, который я использую в качестве матрицы.более быстрый способ построения массива массивов

m = [[f(x[i], y[j]) for i in range(1000)] for j in range(1000)] 

, где f(x,y) некоторая функция, которая возвращает часть х и у. Скажем, Fraction[x,y]. Я генерирую 1000 случайных чисел от 0-10^6 в списке x и y. Время выполнения: 15.8269999027 секунд.

Существуют ли какие-либо структуры данных, которые позволяют мне построить эту матрицу под 1s? Позже я должен использовать это, чтобы найти LU-декомпозицию этой матрицы (мне нужно ее кодировать), и у меня нет доступных библиотек.

+0

Если вам действительно нужно построить эту матрицу, то, возможно, не будет ничего быстрее. Но это зависит от того, что вы действительно хотите сделать с матрицей. –

+0

Если вы находитесь на python 2, начните с использования 'xrange' вместо' range'. Кроме того, вы можете использовать 'numpy'? – juanchopanza

+0

Кажется, что почти все это время должно быть занято миллионными вызовами 'f()'. Как можно угадать, как улучшить время выполнения вашего 'f()'? –

ответ

1

В режиме исполнения используется функция, поэтому нет никакого способа обойти это. Я могу показать вам пример:

import random 
import time 

def randlist(): 
    return [random.randint(0, 10**6) for x in xrange(1000)] 

def f(x, y): 
    return x/y 

random.seed(0) 
x = randlist() 
y = randlist() 

# The code we want to optimize 
start = time.time() 
m = [[f(x[i], y[j]) for i in range(1000)] for j in range(1000)] 
end = time.time() 
print end - start 

# Measuring the function invocations without creating the matrix at all 
start = time.time() 
for i in xrange(1000): 
    for j in xrange(1000): 
    f(x[i], y[j]) 
end = time.time() 
print end - start 

На моем компьютере, создавая матрицу принимает 0.24s во время работы функции 1 миллион раз принимает 0.21s. Поэтому, независимо от того, как вы создадите матрицу, вы сможете сохранить ~ 0.03s.

+0

Это занимает 13 секунд http://pastebin.com/GVNSEkav Я думаю, что доля занимает много времени. –

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