为什么virtualenv(版本20)比python3 -m venv快得多

时间:2020-05-29 07:12:49

标签: python python-3.x virtualenv python-venv

我在2015年的Macbook上进行了测试,virtualenv的速度提高了6倍。

virtualenv版本是20.0.21

$ time virtualenv $RANDOM
created virtual environment CPython3.8.3.final.0-64 in 340ms
  creator CPython3Posix(dest=/private/tmp/4997, clear=False, global=False)
  seeder FromAppData(download=False, pip=latest, setuptools=latest, wheel=latest, via=copy, app_data_dir=/Users/noname/Library/Application Support/virtualenv/seed-app-data/v1.0.1)
  activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator

real    0m0.489s
user    0m0.269s
sys     0m0.283s
$ time /usr/local/opt/python@3.8/bin/python3 -m venv $RANDOM

real    0m3.112s
user    0m2.334s
sys     0m0.731s

python3.8是通过自制程序安装的。

即使使用--creator venv --always-copy选项,virtualenv也更快:

$ time virtualenv --creator venv --always-copy $RANDOM
created virtual environment CPython3.8.3.final.0-64 in 418ms
  creator Venv(dest=/private/tmp/28878, clear=False, global=False, describe=CPython3Posix)
  seeder FromAppData(download=False, pip=latest, setuptools=latest, wheel=latest, via=copy, app_data_dir=/Users/noname/Library/Application Support/virtualenv/seed-app-data/v1.0.1)
  activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator

real    0m0.554s
user    0m0.316s
sys     0m0.309s

为什么它们的性能不一样?

2 个答案:

答案 0 :(得分:2)

据我了解,大多数差异是由于提供新创建的虚拟环境所使用的方法不同。

2020年2月,发布了 virtualenv 的第20版,完全重写了该版本。随之而来的是新概念called seeders,它们定义了用于提供环境的不同方法,即使诸如 pip setuptools 之类的东西在环境中可用。当前版本的 virtualenv 具有两个播种器:

  • pip 可能与 venv 和早期版本的 virtualenv 相似。
  • app-data ,当前的默认种子,它使用不同的机制,并且可能是提高速度的更大贡献。

从文档中:

app-data-此方法使用用户应用程序数据目录创建安装映像。这些映像仅需要创建一次,随后的虚拟环境只需将这些映像链接/复制到其纯python库路径(site-packages文件夹)中。这使得除了第一次虚拟环境创建之外的所有工作都可以快速进行(pip机制通常占用了virtualenv创建时间的98%,因此,通过创建此安装映像,我们可以将其链接到虚拟环境安装目录中,从而可以在进行复制的情况下,将最初的1分钟10秒的剃须速度降低至仅8秒,如果有符号链接,则可缩短至0.8秒-在Windows,Linux / macOS上具有符号链接的情况下,从3秒钟起可降低至100ms )。

在此讨论中,您还可以阅读更多技术细节:

答案 1 :(得分:0)

Virtualenv 20.x只是进行了优化和欺骗,使其变得更快; venv标准库模块没有这些,并且可能也不会得到它们。

相关问题