加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

我的python程序运行速度很慢

发布时间:2020-12-20 12:21:43 所属栏目:Python 来源:网络整理
导读:我正在制作一个程序(至少现在)从TwitchTV(流媒体平台)中检索流信息.这个程序是自我教育自己,但是当我运行它时,只需要2分钟打印流光的名称. 我在Windows7上使用Python 2.7.3 64位,如果这在任何方面都很重要的话. classes.py: #imports:import urllibimport r
我正在制作一个程序(至少现在)从TwitchTV(流媒体平台)中检索流信息.这个程序是自我教育自己,但是当我运行它时,只需要2分钟打印流光的名称.

我在Windows7上使用Python 2.7.3 64位,如果这在任何方面都很重要的话.

classes.py:

#imports:
import urllib
import re

#classes:
class Streamer:

    #constructor:
    def __init__(self,name,mode,link):
        self.name = name
        self.mode = mode
        self.link = link

class Information:

    #constructor:
    def __init__(self,TWITCH_STREAMS,GAME,STREAMER_INFO):
        self.TWITCH_STREAMS = TWITCH_STREAMS
        self.GAME = GAME
        self.STREAMER_INFO = STREAMER_INFO

    def get_game_streamer_names(self):
        "Connects to Twitch.TV API,extracts and returns all streams for a spesific game."

        #start connection
        self.con = urllib2.urlopen(self.TWITCH_STREAMS + self.GAME)
        self.info = self.con.read()
        self.con.close()

        #regular expressions to get all the stream names
        self.info = re.sub(r'"teams":[{.+?"}]','',self.info) #remove all team names (they have the same name: parameter as streamer names)
        self.streamers_names = re.findall('"name":"(.+?)"',self.info) #looks for the name of each streamer in the pile of info


        #run in a for to reduce all "live_user_NAME" values
        for name in self.streamers_names:
            if name.startswith("live_user_"):
                self.streamers_names.remove(name)

        #end method
        return self.streamers_names

    def get_streamer_mode(self,name):
        "Returns a streamers mode (on/off)"

        #start connection
        self.con = urllib2.urlopen(self.STREAMER_INFO + name)
        self.info = self.con.read()
        self.con.close()

    #check if stream is online or offline ("stream":null indicates offline stream)
    if self.info.count('"stream":null') > 0:
        return "offline"
    else:
        return "online"

main.py:

#imports:
from classes import *

#consts:
TWITCH_STREAMS = "https://api.twitch.tv/kraken/streams/?game=" #add the game name at the end of the link (space = "+",eg: Game+Name)
STREAMER_INFO  = "https://api.twitch.tv/kraken/streams/" #add streamer name at the end of the link
GAME = "League+of+Legends"

def main():
    #create an information object
    info = Information(TWITCH_STREAMS,STREAMER_INFO)

    streamer_list = [] #create a streamer list
    for name in info.get_game_streamer_names():
        #run for every streamer name,create a streamer object and place it in the list
        mode =  info.get_streamer_mode(name)
        streamer_name = Streamer(name,'http://twitch.tv/' + name)
        streamer_list.append(streamer_name)

    #this line is just to try and print something
    print streamer_list[0].name,streamer_list[0].mode


if __name__ == '__main__':
    main()

程序本身运行完美,只是非常慢

有任何想法吗?

解决方法

程序效率通常低于80/20规则(或者某些人称之为90/10规则,甚至是95/5规则).也就是说,80%的时间程序在20%的代码中实际运行.换句话说,有一个好的镜头,你的代码有一个“瓶颈”:代码的一小部分运行缓慢,而其余的运行速度非常快.您的目标是确定瓶颈(或瓶颈),然后修复它们(它们)以更快地运行.

执行此操作的最佳方法是分析您的代码.这意味着您要记录logging模块发生特定操作的时间,使用timeit就像建议的评论者一样,使用一些内置的profilers,或者只是在程序的某些点打印出当前时间.最终,您会发现代码的一部分似乎花费了大量时间.

经验告诉您,I / O(从磁盘读取或通过Internet访问资源等内容)将花费比内存计算更长的时间.我对这个问题的猜测是你使用1个HTTP连接获取一个流媒体列表,然后使用一个HTTP连接来获取该流媒体的状态.假设有10000个流媒体:您的程序在完成之前需要建立10001个HTTP连接.

如果确实如此,有几种方法可以解决这个问题:

>看看Twitch.TV是否在其API中有一些替代方案,允许您使用其流模式检索用户列表,这样您就不需要为每个流媒体调用API.
>缓存结果.这实际上不会帮助您的程序在第一次运行时运行得更快,但您可能能够使它在一分钟内第二次运行时,它可以重用结果.
>限制您的应用程序一次只处理几个飘带.如果有10000个飘带,你的应用程序到底做了什么,它真的需要看看它们所有10000个模式的模式?也许最好只抓住前20名,此时用户可以按一个键来获得下一个20,或关闭应用程序.通常,编程不只是编写代码,而是管理用户期望的内容.这似乎是一个宠物项目,所以可能没有“用户”,这意味着你有自由的统治来改变应用程序的功能.
>使用多个连接.现在,您的应用程序与服务器建立一个连接,等待结果返回,解析结果,保存,然后在下一个连接上启动.这个过程可能需要整整半秒钟.如果有250个飘带,那么为每个拖缆运行这个过程总共需要两分多钟.但是,如果您一次可以运行其中的四个,则可能会将总时间减少到不到30秒.查看multiprocessing模块.请记住,某些API可能会限制您在特定时间可以建立的连接数,因此每次使用50个连接进行连接可能会使用它们并导致它们禁止您访问其API.请谨慎使用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读