gpt4 book ai didi

python - 奇怪的 ~150ms 启动惩罚使用 python setuptools

转载 作者:太空宇宙 更新时间:2023-11-03 11:47:23 26 4
gpt4 key购买 nike

我一直在使用 python 的设置工具进行奇怪的 150 毫秒启动惩罚,我构建了一个最小的测试用例,但问题仍然存在:

这个最小案例的项目布局是:

- setup.py
- setuptest
- - __init__.py
- - __main__.py

setup.py 文件包含:

from setuptools import setup

setup(
name = 'setuptest',
version = '0.1',
packages = ['setuptest'],

entry_points = {
'console_scripts' : ['setuptest = setuptest.__main__:main']
} ,
)

__main__.py 文件只包含:

#!/usr/bin/env python2

def main ():
print "hai"

if __name__ == '__main__':
main()

在项目根目录中执行此操作:

 —— — time python2 setuptest
hai

real 0m0.021s
user 0m0.017s
sys 0m0.004s

总脚本执行时间为 21 毫秒,但是,在运行 sudo python2 setup.py install 并执行以下操作后:

 —— — time setuptest 
hai

real 0m0.158s
user 0m0.144s
sys 0m0.012s
—— —

给我 158 毫秒。这 +150 秒的启动延迟时间是一致的,并且在使用 setuptools 时全面发生,但不会发生在我通过包管理器安装的东西或手动安装其他人的项目时,这让我觉得我'我显然做错了什么。

最佳答案

好吧,当您使用 setuptools 安装软件时,它会在 bin 目录中生成可执行脚本,如下所示:

import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
sys.exit(
load_entry_point('<PACKAGE_NAME>', 'console_scripts', '<ENTRY_POINT>')()
)

因为 load_entry_point() 将解析 sys.path 中可用的所有包,您安装的位置和包越多,构建列表所需的时间就越长,然后查找。

有关更多详细信息,我们需要查看 setuptools 的 load_entry_point() 实现:

来自 setuptools.py:load_entry_point() :

def load_entry_point(dist, group, name):
"""Return `name` entry point of `group` for `dist` or raise ImportError"""
return get_distribution(dist).load_entry_point(group, name)

来自 'setuptools.py:get_distribution()' :

def get_distribution(dist):
"""Return a current distribution object for a Requirement or string"""
if isinstance(dist,basestring): dist = Requirement.parse(dist)
if isinstance(dist,Requirement): dist = get_provider(dist)
if not isinstance(dist,Distribution):
raise TypeError("Expected string, Requirement, or Distribution", dist)
return dist

来自 setuptools.py:Distribution.load_entry_point() :

def load_entry_point(self, group, name):
"""Return the `name` entry point of `group` or raise ImportError"""
ep = self.get_entry_info(group,name)
if ep is None:
raise ImportError("Entry point %r not found" % ((group,name),))
return ep.load()

来自 setuptools.py:Distribution.get_entry_info() :

def get_entry_info(self, group, name):
"""Return the EntryPoint object for `group`+`name`, or ``None``"""
return self.get_entry_map(group).get(name)

我会把它留在那里,你可以跟进到它变得昂贵的地方。我猜 Distribution 中的方法映射完成的位置(如 _dep_map 属性)在执行时可能会非常昂贵。

关于python - 奇怪的 ~150ms 启动惩罚使用 python setuptools,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36067138/

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