Другой способ:
12500.to_s.reverse().split(//).inject() {|x,i| (x.gsub(/ /,"").length % 3 == 0 ) ? x + " " + i : x + i}.reverse()
Вы всегда можете открыть класс Fixnum и добавить его для удобства:
module FormatNums
def spaceify
self.to_s.reverse().split(//).inject() {|x,i| (x.gsub(/ /,"").length % 3 == 0 ) ? x + " " + i : x + i}.reverse()
end
end
class Fixnum
include FormatNums
end
12500.spaceify # => "12 500"
Может быть, вы можете использовать wget, а затем проверять данные в Python?
На самом деле разницы быть не должно. Все, что делает urlretrieve, - это простой HTTP-запрос GET. Вы взяли свой код обработки данных и провели прямое сравнение пропускной способности wget и чистого python?
Пожалуйста, покажите нам код. Я почти уверен, что это должно быть в коде, а не в urlretrieve.
Я работал с ним раньше, и у меня никогда не было проблем, связанных со скоростью.
Что касается синтаксического анализа HTML, то, вероятно, самый быстрый / простой вариант - использовать lxml Что касается самих HTTP-запросов: httplib2 очень прост в использовании и, возможно, может ускорить загрузку, поскольку поддерживает соединения http 1.1 keep-alive и сжатие gzip. Существует также pycURL , который утверждает, что он очень быстрый (но более сложный в использовании) и основан на curllib, но я никогда не использовал его.
Вы также можете попробовать загружать разные файлы одновременно , но также имейте в виду, что попытка оптимизировать время загрузки слишком далеко может быть не очень вежливым по отношению к рассматриваемому веб-сайту.
Извините за отсутствие гиперссылок, но SO говорит мне: «Извините, новые пользователи могут размещать только максимум одной гиперссылки »
Скорость передачи данных может легко ввести в заблуждение. Не могли бы вы попробовать следующий сценарий, который просто загружает один и тот же URL-адрес с обоими wget
и urllib.urlretrieve
- запустите его несколько раз, если вы находитесь за прокси, который кэширует URL-адрес со второй попытки.
Для небольших файлов wget займет немного больше времени из-за времени запуска внешнего процесса, но для больших файлов, которые должны быть неуместным.
from time import time
import urllib
import subprocess
target = "http://example.com" # change this to a more useful URL
wget_start = time()
proc = subprocess.Popen(["wget", target])
proc.communicate()
wget_end = time()
url_start = time()
urllib.urlretrieve(target)
url_end = time()
print "wget -> %s" % (wget_end - wget_start)
print "urllib.urlretrieve -> %s" % (url_end - url_start)
import subprocess
myurl = 'http://some_server/data/'
subprocess.call(["wget", "-r", "-np", "-A", "files", myurl])
Вероятно, это ошибка единичной математики с вашей стороны.
Просто обратите внимание, что 500 КБ / с (килобайт) равняется 4 Мбит / с (мегабитам) .
urllib работает на меня так же быстро, как wget. попробуйте этот код. он показывает прогресс в процентах так же, как и wget.
import sys, urllib
def reporthook(a,b,c):
# ',' at the end of the line is important!
print "% 3.1f%% of %d bytes\r" % (min(100, float(a * b) / c * 100), c),
#you can also use sys.stdout.write
#sys.stdout.write("\r% 3.1f%% of %d bytes"
# % (min(100, float(a * b) / c * 100), c)
sys.stdout.flush()
for url in sys.argv[1:]:
i = url.rfind('/')
file = url[i+1:]
print url, "->", file
urllib.urlretrieve(url, file, reporthook)
Вы можете использовать wget -k
, чтобы задействовать относительные ссылки во всех URL-адресах.