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

Python 紧密循环可以调用其他文件吗?,python,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) ut

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


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

当您第一次导入模块时,Python会缓存模块的内容。解释器运行模块的代码(包括类和函数的定义),并保留全局名称空间供您以后访问。因此,从另一个模块中查找函数或变量的成本不会过高。这与在当前模块中查找全局变量非常相似

然而,这并不是说它是免费的。查找属性或全局变量需要进行一些字典查找,理论上这可能是某些高性能代码中最慢的部分。在这种情况下,您可能希望将查找缓存在局部变量中(可以非常快速地访问)


但这很少是必要的,因为通常代码的其他部分(例如,
数据
的迭代或
做某事
的主体)将花费大量时间,如果您将重复属性查找的成本留在噪声中,它将丢失。在您的示例代码中,web请求和HTML解析将比查找函数慢几个数量级,因此您可能根本不需要担心。

import语句是加载该文件内容的地方。此后您不必担心。这段代码是否会导致内存错误?@Blorgbeard否,这只是一个示例来说明这一概念。@Blorgbeard我想我想知道在main_loop()的每次迭代中是否以任何方式处理了“导入请求”行。或者get_data()是否在运行时被拉入main.py?我不确定您到底担心什么,但这是正常的做法,如果这能让您感觉更好的话。注意,重要的是要理解,函数不在.py文件中,源代码在.py文件中。一旦执行了源代码,该函数就存在于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)