Или если Вы хотите установить его, так, чтобы это всегда использовалось с urllib2.urlopen (таким образом, Вы не должны сохранять ссылку на новичка вокруг):
import urllib2
url = 'www.proxyurl.com'
username = 'user'
password = 'pass'
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
# None, with the "WithDefaultRealm" password manager means
# that the user/pass will be used for any realm (where
# there isn't a more specific match).
password_mgr.add_password(None, url, username, password)
auth_handler = urllib2.HTTPBasicAuthHandler(password_mgr)
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
print urllib2.urlopen("http://www.example.com/folder/page.html").read()
Как сказал Майкл Берр, хотя накладные расходы сильно зависят от вашей платформы, накладные расходы определенно меньше, чем время, необходимое для их передачи по сети.
приблизительная оценка:
Полезная нагрузка 800 Мбит / с на отличном гигабитном кабеле, 25 Мбит / с с плавающей точкой в секунду.
На одноядерном процессоре 2 ГГц это дает колоссальные 80 тактовых циклов для каждое значение преобразуется в безубыточность - ничего меньше, и вы сэкономите время. Этого должно быть более чем достаточно для всех архитектур :)
Простой цикл загрузки-сохранения (без всех задержек кэширования) должен быть меньше 5 циклов на значение. С чередованием инструкций, расширениями SIMD и / или распараллеливанием на нескольких ядрах вы, вероятно, будете выполнять несколько преобразований за один цикл.
Кроме того, получателю будет удобно обрабатывать только половину данных. Помните, что время доступа к памяти нелинейно.
Единственное, что возражает против преобразования, это то, что передача должна иметь минимальную нагрузку на ЦП: современная архитектура может передавать данные с диска / памяти на шину без вмешательства ЦП. Однако с приведенными выше цифрами я бы сказал, что на практике это не имеет значения.
[править]
Я проверил некоторые числа, сопроцессору 387 действительно потребовалось бы около 70 циклов для цикла загрузки-сохранения. На начальном Pentium у вас осталось 3 цикла без какого-либо распараллеливания.
Итак, если вы не запустите гигабитную сеть на 386 ...
Это будет зависеть от вашей реализации библиотек C ++. Протестируйте и посмотрите.
Даже если это займет время, это не будет самой медленной точкой в вашем приложении.
Ваш FPU может выполнять преобразование намного быстрее, чем он может отправлять сетевой трафик (поэтому узким местом здесь, скорее всего, будет запись в сокет).
Но, как и во всех подобных вещах, измерьте это и посмотрите.
Лично я не думаю, что время, проведенное здесь, повлияет на реальное время, потраченное на отправку данных.
Предполагая, что вы говорите о значительном количестве пакетов для отправки данных (разумное предположение, если вы отправляете миллионы значений), приведение двойников к плавающим, вероятно, уменьшит количество сетевых пакетов примерно наполовину (при условии sizeof (double) == 8
и sizeof (float) == 4
).
Почти наверняка экономия сетевого трафика будет преобладать независимо от времени, потраченного на преобразование. Но, как все говорят, измерение некоторых тестов будет доказательством пудинга.
Принимая во внимание, что большинство компиляторов обрабатывают удвоения
намного эффективнее, чем float
- многие продвигают float
в double
перед выполнением операций с ними - я бы подумал о том, чтобы взять блок данных, сжать / сжать его, а затем отправить сжатый блок. В зависимости от того, как выглядят ваши данные, вы можете получить сжатие 60-90% по сравнению с 50%, которые вы получите при преобразовании 8-байтовых значений в четыре байта.
У вас нет другого выбора, кроме как измерить их самостоятельно и посмотреть. Вы можете использовать таймеры для их измерения. Похоже, некоторые уже реализовали изящный класс таймера C ++
Я думаю, что это приведение намного дешевле, чем вы думаете, поскольку на самом деле оно не требует каких-либо вычислений. Фактически, это просто сдвиг битов, чтобы избавиться от некоторых цифр в экспоненте и мантиссе.
Это также будет зависеть от процессора и его поддержки с плавающей запятой. В старые добрые времена (1980-е годы) процессоры поддерживали только целочисленные операции. Математику с плавающей запятой нужно было эмулировать в программном обеспечении. Отдельный чип для операций с плавающей запятой (сопроцессор ) можно было купить отдельно.
Современные процессоры теперь имеют инструкции SIMD , поэтому можно обрабатывать большие объемы данных с плавающей запятой одновременно. Эти инструкции включают MMX, SSE, 3DNow! и тому подобное. Ваш компилятор может знать, как использовать эти инструкции, но вам может потребоваться написать свой код определенным образом и включить правильные параметры.
Наконец, самый быстрый способ обработки данных с плавающей запятой - это видеокарта . Достаточно новый язык под названием OpenCL позволяет отправлять задачи на видеокарту для обработки.
Все зависит от того, какая производительность вам нужна.