Как работает urllib.urlopen ()? - PullRequest
       7

Как работает urllib.urlopen ()?

2 голосов
/ 26 августа 2011

Рассмотрим большой файл (~ 100 МБ).Давайте рассмотрим, что файл основан на строках (текстовый файл с относительно короткой строкой ~ 80 символов).Если я использую встроенный open() / file(), файл будет загружен ленивым образом .То есть, если я делаю aFile.readline(), то только часть файла будет находиться в памяти.Делает ли urllib.urlopen () нечто подобное (с использованием кэша на диске)?

Насколько велика разница в производительности между urllib.urlopen().readline() и file().readline()?Давайте рассмотрим, что файл находится на localhost.Однажды я открываю его с помощью urllib.urlopen(), а затем с file().Насколько велика будет разница в производительности / потреблении памяти, когда я зациклюсь на файле с readline()?

Как лучше всего обработать файл, открытый с помощью urllib.urlopen()?Это быстрее обрабатывать это построчно?Или я должен загрузить несколько строк (~ 50) в список, а затем обработать список?

Ответы [ 2 ]

2 голосов
/ 26 августа 2011

open (или file) и urllib.urlopen выглядят так, будто они более или менее делают то же самое.urllib.urlopen (в основном) создает socket._socketobject и затем вызывает метод makefile (содержание этого метода включено ниже)

def makefile(self, mode='r', bufsize=-1):
    """makefile([mode[, bufsize]]) -> file object

    Return a regular file object corresponding to the socket.  The mode
    and bufsize arguments are as for the built-in open() function."""
    return _fileobject(self._sock, mode, bufsize)
1 голос
/ 26 августа 2011

Делает ли urllib.urlopen () нечто подобное (с использованием кеша на диске)?

Операционная система.При использовании сетевого API, такого как urllib, операционная система и сетевая карта будут выполнять низкоуровневую работу по разбиению данных на небольшие пакеты, отправляемые по сети, и для приема входящих пакетов.Они хранятся в кеше, так что приложение может абстрагироваться от концепции пакета и делать вид, что оно будет отправлять и получать непрерывные потоки данных.

Насколько велика разница в производительности между urllib.urlopen().readline() иfile().readline()?

Трудно сравнить эти два.Для urllib это зависит от скорости сети, а также от скорости сервера.Даже для локальных серверов существуют некоторые издержки абстракции, поэтому обычно из сетевого API-интерфейса читать медленнее, чем напрямую из файла.

Для фактического сравнения производительности вам придется написать тестовый скрипти сделай замер.Тем не менее, почему вы вообще беспокоитесь?Вы не можете заменить одно другим, поскольку они служат разным целям.

Каков наилучший способ обработки файла, открытого через urllib.urlopen()?Это быстрее обрабатывать это построчно?Или я должен загрузить несколько строк (~ 50) в список, а затем обработать список?

Поскольку узким местом является скорость сетевого подключения, было бы неплохо обработать данные в ближайшее время.как вы поняли.Таким образом, операционная система может кэшировать больше входящих данных «в фоновом режиме».

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

...