我想知道循环重复调用python中其他文件是否是不好的做法,还是python处理起来比我想的要好?
我有一个看起来像这样的包裹:
__init__.py
main.py
utils.py
main.py
import utils
def main_loop():
urls = [list_with_many_strings]
for url in urls:
data = utils.get_data(url)
print(data)
utils.py
import requests
from bs4 import BeautifulSoup
def get_data(url):
page = requests.get(url)
soup = BeautifulSoup(page.text)
data = soup.find(id='spam')
return data
我的问题是,通常调用这样的其他文件是否错误。 python在循环中每次迭代都必须引用utils.py吗?还是只需要一次缓存get_data()函数?
这是一个非常基本的示例,但是我遇到了函数重复调用其他文件的函数出现内存错误,我想知道这是否是原因。
答案 0 :(得分:1)
第一次import
时,Python会缓存模块的内容。解释器运行模块的代码(包括类和函数的定义),并保留全局名称空间供您以后访问。因此,继续从另一个模块中查找函数或变量并不会花费太多。就像在当前模块中查找全局变量一样。
但这并不是说它是免费的。查找属性或全局变量需要进行一些字典查找,从理论上讲,这可能是某些高性能代码中最慢的部分。在这种情况下,您可能希望将查找缓存在本地变量中(可以非常快速地访问它)。
def example(data):
lookup = foo.bar # cache an attribute lookup in a local variable
for x in data:
do_something(lookup, x) # use local variable rather than do_something(foo.bar, x)
但这很少是必需的,因为通常代码的其他部分(例如,在data
上的迭代或do_something
的主体)将花费大量时间,以至于需要重复进行属性查找如果您将其保留下来,则会迷失在噪声中。在示例代码中,Web请求和HTML解析比查找功能要慢几个数量级,因此您可能根本不必担心。