gpt4 book ai didi

python - 我的 python 程序运行得非常慢

转载 作者:太空狗 更新时间:2023-10-30 01:51:45 25 4
gpt4 key购买 nike

我正在制作一个程序(至少现在)从 TwitchTV(流媒体平台)检索流媒体信息。这个程序是为了自学,但是当我运行它时,只需要 2 分钟就可以打印主播的名字。

我在 Windows7 上使用 Python 2.7.3 64 位,如果这无论如何都很重要的话。

类.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"

主要.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, GAME, 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, mode, '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。在这里要小心。

关于python - 我的 python 程序运行得非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15054008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com