httplib(discogsapi)的python性能

httplib(discogsapi)的python性能,python,performance,web-services,discogs-api,Python,Performance,Web Services,Discogs Api,我写了一个简短的程序,它将discogsapi与python结合使用,但速度太慢,无法用于真正的web应用程序。 以下是Python代码和Python概要文件结果(仅发布了耗时点): 下面是Python概要文件的结果: Performance Analysis of Discogs API ================================================================================ 82807 function calls

我写了一个简短的程序,它将discogsapi与python结合使用,但速度太慢,无法用于真正的web应用程序。 以下是Python代码和Python概要文件结果(仅发布了耗时点):

下面是Python概要文件的结果:

Performance Analysis of Discogs API
================================================================================
   82807 function calls (282219 primitive calls) in 177.544 seconds
   Ordered by: standard name
   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
      188  121.013    0.644  121.013    0.644 :0(connect)
      206   52.080    0.253   52.080    0.253 :0(recv)
        1    0.036    0.036  177.494  177.494 <string>:1(<module>)
      188    0.013    0.000  175.234    0.932 adapters.py:261(send)
      376    0.005    0.000    0.083    0.000 adapters.py:94(init_poolmanager)
      188    0.008    0.000  176.569    0.939 api.py:17(request)
      188    0.007    0.000  176.577    0.939 api.py:47(get)
      188    0.015    0.000  173.922    0.925 connectionpool.py:268(_make_request)
      188    0.015    0.000  174.034    0.926 connectionpool.py:332(urlopen)
        1    0.496    0.496  177.457  177.457 discogsTestFullDump.py:6(main)
      564    0.009    0.000  176.613    0.313 discogs_client.py:66(_response)
      188    0.012    0.000  176.955    0.941 discogs_client.py:83(data)
      188    0.011    0.000   51.759    0.275 httplib.py:363(_read_status)
      188    0.017    0.000   52.520    0.279 httplib.py:400(begin)
      188    0.003    0.000  121.198    0.645 httplib.py:754(connect)
      188    0.007    0.000  121.270    0.645 httplib.py:772(send)
      188    0.005    0.000  121.276    0.645 httplib.py:799(_send_output)
      188    0.003    0.000  121.279    0.645 httplib.py:941(endheaders)
      188    0.003    0.000  121.348    0.645 httplib.py:956(request)
      188    0.016    0.000  121.345    0.645 httplib.py:977(_send_request)
      188    0.009    0.000   52.541    0.279 httplib.py:994(getresponse)
        1    0.000    0.000  177.544  177.544 profile:0(print main(); print)
      188    0.032    0.000  176.322    0.938 sessions.py:225(request)
      188    0.030    0.000  175.513    0.934 sessions.py:408(send)
      752    0.015    0.000  121.088    0.161 socket.py:223(meth)
     2256    0.224    0.000   52.127    0.023 socket.py:406(readline)
      188    0.009    0.000  121.195    0.645 socket.py:537(create_connection)
Discogs API的性能分析 ================================================================================ 177.544秒内完成82807次函数调用(282219次基本调用) 订购人:标准名称 ncalls tottime percall cumtime percall文件名:lineno(函数) 188 121.013 0.644 121.013 0.644:0(连接) 206 52.080 0.253 52.080 0.253:0(recv) 1 0.036 0.036 177.494 177.494 :1() 188 0.013 0.000 175.234 0.932适配器。py:261(发送) 376 0.005 0.000 0.083 0.000适配器。py:94(初始池管理器) 188 0.008 0.000 176.569 0.939 api.py:17(请求) 188 0.007 0.000 176.577 0.939 api.py:47(get) 188 0.015 0.000 173.922 0.925连接池。py:268(_make_request) 188 0.015 0.000 174.034 0.926连接池。py:332(urlopen) 1 0.496 0.496 177.457 177.457 discogsTestFullDump.py:6(主) 564 0.009 0.000 176.613 0.313 discogs_客户。py:66(_响应) 188 0.012 0.000 176.955 0.941 discogs_客户。py:83(数据) 188 0.011 0.000 51.759 0.275 httplib.py:363(读取状态) 188 0.017 0.000 52.520 0.279 httplib.py:400(开始) 188 0.003 0.000 121.198 0.645 httplib.py:754(连接) 188 0.007 0.000 121.270 0.645 httplib.py:772(发送) 188 0.005 0.000 121.276 0.645 httplib.py:799(发送输出) 188 0.003 0.000 121.279 0.645 httplib.py:941(端头) 188 0.003 0.000 121.348 0.645 httplib.py:956(请求) 188 0.016 0.000 121.345 0.645 httplib.py:977(发送请求) 188 0.009 0.000 52.541 0.279 httplib.py:994(getresponse) 1 0.000 0.000 177.544 177.544配置文件:0(主打印();打印) 188 0.032 0.000 176.322 0.938课时。py:225(请求) 188 0.030 0.000 175.513 0.934节。py:408(发送) 7520.015 0.000 121.088 0.161插座。py:223(甲基) 2256 0.224 0.000 52.127 0.023插座。py:406(读线) 188 0.009 0.000 121.195 0.645插座。py:537(创建_连接) 有人知道如何加快速度吗。 我希望discogs_client.py中的一些更改会更快。 也许是从httplib改成了其他的东西,或者别的什么。 或者使用另一个协议而不是http会更快

(可以在此处访问discogs_client.py的源:“”)

如果有人有任何想法,请回复,很多人都会从中受益

问候
Daniel

尝试以下方法:使用f.write('hello\n')而不是使用print>>写入文件

更新:来自discogs文档:
请求由服务器限制为每个IP地址每秒一个请求。您的应用程序应该(但不必)考虑到这一点,并在本地限制请求。

瓶颈似乎在(discogs)服务器端,检索单个版本。除了给他们钱买更快的服务器,你真的无能为力

我的建议是缓存结果,这可能是唯一有帮助的方法。重写discogs.APIBase.\u响应,如下所示:

def _response(self):
    if not self._cached_response:
        self._cached_response=self._load_response_from_disk()
    if not self._cached_response:
        if not self._check_user_agent():
            raise UserAgentError("Invalid or no User-Agent set.")
        self._cached_response = requests.get(self._uri, params=self._params, headers=self._headers)
        self._save_response_to_disk()

    return self._cached_response
另一种方法是将请求写入日志并说“我们不知道,稍后再试”,然后在另一个过程中,读取日志,下载数据,将其存储在数据库中。然后,当他们稍后返回时,请求的数据将准备就绪


您需要自己将_load _response _from _disk()和_save _response _to _disk()-存储的数据应该具有
\u uri、_参数和_headers
作为键,并且应该包含数据的时间戳。如果数据太旧(在这种情况下,我建议以月为单位-我不知道编号是否持续-我猜最初是几天-几周),或者没有找到,则返回None。存储必须处理并发访问和快速索引(可能是数据库)。

开销在http gets中,每个记录一个。输出不算什么。我不知道“每个IP地址每秒一个”。非常感谢。预取功能听起来不错,但解析他们的网站可能更快。无论如何,非常感谢你。
def _response(self):
    if not self._cached_response:
        self._cached_response=self._load_response_from_disk()
    if not self._cached_response:
        if not self._check_user_agent():
            raise UserAgentError("Invalid or no User-Agent set.")
        self._cached_response = requests.get(self._uri, params=self._params, headers=self._headers)
        self._save_response_to_disk()

    return self._cached_response