Некоторые измерения производительности, используя timeit
вместо попытки сделать это вручную с помощью time
.
Во-первых, Apple 2.7.2 64-бит:
In [37]: %timeit collections.deque((x for x in xrange(10000000) if x%4 == 0), maxlen=0)
1 loops, best of 3: 1.05 s per loop
Теперь, python.org 3.3.0 64-бит:
In [83]: %timeit collections.deque((x for x in range(10000000) if x%4 == 0), maxlen=0)
1 loops, best of 3: 1.32 s per loop
In [84]: %timeit collections.deque((x for x in xrange(10000000) if x%4 == 0), maxlen=0)
1 loops, best of 3: 1.31 s per loop
In [85]: %timeit collections.deque((x for x in iter(range(10000000)) if x%4 == 0), maxlen=0)
1 loops, best of 3: 1.33 s per loop
По-видимому, 3.x range
действительно немного медленнее, чем 2.x xrange
. И функция OP xrange
не имеет к этому никакого отношения. (Неудивительно, что одноразовый вызов слота __iter__
вряд ли будет заметен среди 10000000 звонков на все, что происходит в цикле, но кто-то поднял его как возможность.)
Но это всего на 30% медленнее. Как OP получал 2x так же медленно? Хорошо, если я повторю те же тесты с 32-битным Python, я получаю 1.58 против 3.12. Так что я предполагаю, что это еще один из тех случаев, когда 3.x оптимизирован для 64-битной производительности, так как это может повредить 32-битные.
Но действительно ли это имеет значение? Проверьте это, с 3.3.0 64-бит снова:
In [86]: %timeit [x for x in range(10000000) if x%4 == 0]
1 loops, best of 3: 3.65 s per loop
Таким образом, создание list
занимает более чем вдвое больше, чем вся итерация.
А что касается «потребляет гораздо больше ресурсов, чем Python 2.6+», из моих тестов это выглядит так: 3.x range
имеет тот же размер, что и 2.x xrange
- и , даже если он был в 10 раз больше, создание ненужного списка по-прежнему на 10000000 пикселей больше, чем что-либо, что может сделать итерация диапазона.
А как насчет явного цикла for
вместо C петля внутри deque
?
In [87]: def consume(x):
....: for i in x:
....: pass
In [88]: %timeit consume(x for x in range(10000000) if x%4 == 0)
1 loops, best of 3: 1.85 s per loop
Таким образом, почти столько же времени потрачено в работе for
, как в действительной работе по итерации range
.
Если вы 're беспокоится об оптимизации итерации объекта диапазона, вы, вероятно, смотрите не в то место.
Между тем вы продолжаете спрашивать, почему xrange
был удален, независимо от того, сколько раз люди скажу вам одно и то же, но повторю еще раз: он не был удален: он был переименован в range
, а 2.x range
- это то, что было удалено.
Вот некоторые доказательства что объект 3.3 range
является прямым потомком объекта 2.x xrange
(а не 2.x range
fu nction): источник 3.3 range
и 2.7 xrange
. Вы даже можете увидеть историю изменений (связанная, по-моему, с изменением, которое заменило последний экземпляр строки «xrange» в любом месте файла).
Итак, почему это медленнее?
Ну, во-первых, они добавили много новых функций. С другой стороны, они сделали всевозможные изменения повсюду (особенно внутри итерации), которые имеют незначительные побочные эффекты. И было много работы, чтобы резко оптимизировать различные важные случаи, даже если это иногда слегка пессимизирует менее важные случаи. Добавьте все это, и я не удивлюсь, что итерация range
как можно быстрее стала немного медленнее. Это один из тех менее важных случаев, о которых никто никогда не заботится, чтобы сосредоточиться. Никто, вероятно, никогда не будет иметь реальный случай использования, где это различие в производительности - это горячая точка в их коде.
Я не нашел никакой информации о HTTP API для Mega. Вы пытаетесь получить доступ к сайту через веб-интерфейс, который вы бы использовали в своем браузере? Это может быть очень трудно или невозможно заставить ваше программное обеспечение работать таким образом.
Обычно вы используете простые HTTP-запросы, только когда служба, к которой вы пытаетесь получить доступ, предоставляет работающий REST API. (см., например, Spotify API )
Возможно, рассмотрим этот пример для доступа к Mega из Python. При этом используется официальный API Mega C ++, доступ к которому вы можете получить из скрипта Python.
Вы можете прочитать requests
документацию об Аутентификации , она дает несколько способов аутентификации через HTTP.
Вы можете найти его здесь .