2016-03-29 3 views
0

Я создаю список с помощьюОптимизация создания списка в Python

sum_range=list(2**x for x in range(start_range,end_range+1)) 

Здесь start_range и end_range принимать большие значения от 0 до 4 миллионов человек.

Эта строка кода, похоже, является горлышком бутылки. В конечном счете, я хочу получить сумму всего числа в списке sum_range. Может быть, есть лучший способ сделать это?

Время принимать, когда: -

start_range = 188640 end_range = 197280

код занимает около 6 секунд, чтобы работать на моей системе.

+1

Если вы используете Python 2, используйте 'xrange', он использует ленивые вычисления. – idjaw

+0

@idjaw: Учитывая, насколько невероятно огромная '2 ** x', NumPy не поможет. – user2357112

+1

Вы пытаетесь создать 2^4000000? Просто запустить '2 ** (4 * 10 ** 6)' достаточно, чтобы заморозить мою подсказку Python за хорошие 30 секунд, вы уверены, что это то, что вам нужно сделать? – Marius

ответ

4

Сумма баллов за 2**n известна алгебраически. Для n = 0 до m это: 2**(m+1)-1. Итак, если вы хотите узнать это от a до b (включительно), возьмите 2**(b+1) - 2**(a+1) + 2**a. Посмотрите геометрические ряды для общего случая.

+0

Извините, не заметил комментариев Сергея. – roadrunner66

1

Попробуйте использовать оператор "<<" вместо "**", он также сэкономит время на обработку от 4.0~5.0 seconds до 0.07~0.33 seconds.

import datetime 

t_start_1 = datetime.datetime.utcnow() 
sum_range_1 = list(1<<x for x in range(188640,197280)) 
t_end_1 = datetime.datetime.utcnow() 
print "using '<<' cost: " + str(t_end_1 - t_start_1) + "seconds" 

t_start_2 = datetime.datetime.utcnow() 
sum_range_2 = list(2**x for x in range(188640,197280)) 
t_end_2 = datetime.datetime.utcnow() 
print "using '**' cost: " + str(t_end_2 - t_start_2) + "seconds" 

выход:

using '<<' cost: 0:00:00.327000 seconds 
using '**' cost: 0:00:04.990000 seconds 
+0

Отличное решение. Я объединил и формулу, и ваше решение. 1000 итераций с использованием формулы, используемой для меня на 30 секунд. 1000 итераций с использованием формулы и << занимает 3 секунды. – user3398752

+0

если это поможет, пожалуйста, проголосуйте за него :) – Yunhe