Войдите в mega.nz, используя запросы Python

Некоторые измерения производительности, используя 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 как можно быстрее стала немного медленнее. Это один из тех менее важных случаев, о которых никто никогда не заботится, чтобы сосредоточиться. Никто, вероятно, никогда не будет иметь реальный случай использования, где это различие в производительности - это горячая точка в их коде.

0
задан Jack Moody 16 January 2019 в 18:01
поделиться

2 ответа

Я не нашел никакой информации о HTTP API для Mega. Вы пытаетесь получить доступ к сайту через веб-интерфейс, который вы бы использовали в своем браузере? Это может быть очень трудно или невозможно заставить ваше программное обеспечение работать таким образом.

Обычно вы используете простые HTTP-запросы, только когда служба, к которой вы пытаетесь получить доступ, предоставляет работающий REST API. (см., например, Spotify API )

Возможно, рассмотрим этот пример для доступа к Mega из Python. При этом используется официальный API Mega C ++, доступ к которому вы можете получить из скрипта Python.

0
ответ дан Florian Lüdiger 16 January 2019 в 18:01
поделиться

Вы можете прочитать requests документацию об Аутентификации , она дает несколько способов аутентификации через HTTP.

Вы можете найти его здесь .

0
ответ дан Rémi Héneault 16 January 2019 в 18:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: