почему virtualenv (версия 20) намного быстрее, чем python3 -m venv - PullRequest
1 голос
/ 29 мая 2020

Я тестировал на своем macbook 2015 года, 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 устанавливается через homebrew.

даже с параметрами --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 ]

2 голосов
/ 01 июня 2020

Насколько я понял, большая часть различий связана с разными методами, используемыми для подготовки вновь созданных виртуальных сред.

В феврале 2020 года была выпущена версия 20 virtualenv , это была полная переделка. И вместе с ним появилась новая концепция , называемая сидеры , которые определяют различные методы для предоставления среды, то есть создают такие вещи, как pip и setuptools доступно в окружающей среде. Текущие версии virtualenv имеют две сеялки:

  • pip , что, вероятно, похоже на venv и более ранние версии virtualenv do.
  • app-data , текущая сеялка по умолчанию, которая использует другой механизм и, вероятно, вносит больший вклад в повышение скорости.

Из документации:

app-data - этот метод использует каталог данных пользовательского приложения для создания образов установки. Эти образы необходимо создать только один раз, и последующие виртуальные среды могут просто связать / скопировать эти изображения в свой чистый путь библиотеки python (папка site-packages). Это позволяет быстро создавать все виртуальные среды, кроме первого (механизм pip обычно занимает 98% времени создания virtualenv, поэтому, создав этот установочный образ, который мы можем просто связать с установочным каталогом виртуальных сред, мы можем добиться ускорения. сокращения начальных 1 минут 10 секунд до 8 секунд в случае копирования или 0,8 секунды в случае наличия символических ссылок - это на Windows, Linux / macOS с символическими ссылками, это может быть всего 100 мс с 3+ секунд ).

Вы также можете прочитать немного больше технических деталей в этом обсуждении:

0 голосов
/ 01 июня 2020

В Virtualenv 20.x просто есть оптимизации и хитрости, которые делают его быстрее; venv в стандартном библиотечном модуле их нет и, вероятно, он тоже не получит.

...