Убедитесь, что вы уже закрыли соединение с базой данных или нет. В моем случае я получал ошибку, потому что соединение было близко в верхней строке.
диапазон создает список, поэтому если Вы делаете range(1, 10000000)
, он создает список в памяти с 9999999
элементы.
xrange
объект последовательности, который оценивает лениво.
Это должно быть добавлено от подсказки @Thiago, что в python3, диапазон делает эквивалент xrange
PythonПосмотрите этот сообщение для нахождения различия между диапазоном и xrange:
Для заключения в кавычки:
range
возвраты точно, что Вы думаете: список последовательных целых чисел, определенной длины, начинающейся 0.xrange
, однако, возвраты "xrange возражают" , который действует много как итератор
xrange использует итератор (генерирует значения на лету), диапазон возвращает список.
диапазон генерирует весь список и возвращает его. xrange не делает - он генерирует числа в списке по требованию.
диапазон создает список, поэтому если Вы делаете
range(1, 10000000)
, он создает список в памяти с9999999
элементы.
xrange
генератор, таким образом, этоявляется объект последовательности,, который оценивает лениво.
Это верно, но в Python 3, .range()
будет реализован Python 2 .xrange()
. Если необходимо на самом деле генерировать список, необходимо будет сделать:
list(range(1,100))
Помните, используйте timeit
модуль для тестирования, какой из маленьких отрывков кода быстрее!
$ python -m timeit 'for i in range(1000000):' ' pass'
10 loops, best of 3: 90.5 msec per loop
$ python -m timeit 'for i in xrange(1000000):' ' pass'
10 loops, best of 3: 51.1 msec per loop
Лично, я всегда использую .range()
, если я не имел дело с действительно огромные списки - как Вы видите, мудрый временем, для списка миллиона записей, дополнительные издержки составляют только 0,04 секунды. И поскольку Corey указывает, в Python 3.0 .xrange()
уйдет, и .range()
даст Вам хорошее поведение итератора так или иначе.
xrange
только хранилища параметрические усилители диапазона и генерирует числа по требованию. Однако реализация C Python в настоящее время ограничивает свой args C longs:
xrange(2**32-1, 2**32+1) # When long is 32 bits, OverflowError: Python int too large to convert to C long
range(2**32-1, 2**32+1) # OK --> [4294967295L, 4294967296L]
Примечание, что в Python 3.0 существуют [только 112] и он ведет себя как 2.x xrange
, но без ограничений на минимальные и максимальные конечные точки.
xrange возвращает итератор и только сохраняет одно число в памяти за один раз. диапазон сохраняет весь список чисел в памяти.
диапазон создает список, поэтому если Вы действительно располагаетесь (1, 10000000), он создает список в памяти с 10 000 000 элементов. xrange является генератором, таким образом, он оценивает лениво.
Это приносит Вам два преимущества:
MemoryError
. Действительно проведите некоторое время с Справочное руководство по библиотеке . Чем более знакомы Вы с ним, тем быстрее можно найти ответы на вопросы как это. Особенно важный первые несколько глав о встроенных объектах и типах.
преимущество типа xrange состоит в том, что объект xrange будет всегда брать тот же объем памяти, неважно, размер диапазона, который это представляет. Нет никаких последовательных преимуществ производительности.
Другим способом найти быструю информацию о конструкции Python является docstring и функция справки:
print xrange.__doc__ # def doc(x): print x.__doc__ is super useful
help(xrange)
Это по причинам оптимизации.
диапазон () создаст список значений от запуска для окончания (0.. 20 в Вашем примере). Это станет дорогой операцией на очень больших спектрах.
xrange (), с другой стороны, намного более оптимизирован. это только вычислит следующее значение при необходимости (через объект последовательности xrange) и не создает список всех значений как диапазон (), делает.