python-有更快的方法可以在Go中发出GET请求吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-有更快的方法可以在Go中发出GET请求吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1699字,纯文字阅读大概需要3分钟。
内容图文
![python-有更快的方法可以在Go中发出GET请求吗?](/upload/InfoBanner/zyjiaocheng/665/a32a91f8e4264ba2a80b32972b9dfcba.jpg)
考虑以下程序:
package main
import (
"net/http"
"os"
)
var url = "https://upload.wikimedia.org/wikipedia/commons/f/fe/FlumeRide%2C_Liseberg_-_last_steep_POV.ogv"
func main() {
response, _ := http.Get(url)
defer response.Body.Close()
f, _ := os.Create("output.ogv")
defer f.Close()
_, err = io.Copy(f, response.Body)
}
它与wget $url具有相同的功能,大约需要7.3秒才能运行. wget只需要4.6秒.为什么存在巨大差异?这个简单的Python程序会在将整个视频写入磁盘之前将整个视频加载到内存中,大约需要5.2秒:
import requests
url = "https://upload.wikimedia.org/wikipedia/commons/f/fe/FlumeRide%2C_Liseberg_-_last_steep_POV.ogv"
def main():
r = requests.get(url)
with open('output.ogv','wb') as output:
output.write(r.content)
if __name__ == "__main__":
main()
剖析
我已经对此进行了调查.这是我采取的一些方法:
>在io.Copy中使用不同的缓冲区大小
>使用其他读者/作家
>并发/并行
>下载更大的文件
不同的缓冲区大小
我使用io.CopyBuffer尝试了许多不同的缓冲区大小,并且发现默认的缓冲区大小32KB使我拥有最佳的速度(仍然比wget和Python的要求慢1.6到1.8倍).
其他读者/作家
所有其他读者和作家的速度都比使用io.Copy慢得多.我尝试使用(f * File)Write和其他一些缓冲的读取器/写入器.
并发/并行
我什至编写了一个相当长的程序,该程序使用标头中的范围来并行下载此文件,但是正如预期的那样,我的速度似乎没有任何显着的提高.
较大的文件
我下载的文件比这个文件大三倍,而Go的实现仍然比wget和请求慢1.5到2倍.
其他注意事项
>在计时之前,我正在构建二进制文件.
>大部分时间都花在实际编写/复制响应上.不管我下载的文件有多大,该部分似乎都占了大约0.3秒的时间.
那我在做什么错?我应该只期望GET请求在Go中花费更长的时间吗?
解决方法:
我不确定该告诉你什么.我只是想重复您的发现,但是对我来说,所有3个版本花费的时间大致相同
wget 8.035s
go 8.174s
python 8.242s
也许可以在干净的VM或Docker容器中尝试相同的实验?
内容总结
以上是互联网集市为您收集整理的python-有更快的方法可以在Go中发出GET请求吗?全部内容,希望文章能够帮你解决python-有更快的方法可以在Go中发出GET请求吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。