紧密循环可以调用其他文件吗?

时间:2019-06-12 22:10:40

标签: python

我想知道循环重复调用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()函数?

这是一个非常基本的示例,但是我遇到了函数重复调用其他文件的函数出现内存错误,我想知道这是否是原因。

1 个答案:

答案 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解析比查找功能要慢几个数量级,因此您可能根本不必担心。