Skip to content

Improve performance and output of pyenv virtualenvs#502

Open
samdoran wants to merge 17 commits intopyenv:masterfrom
samdoran:improve-performance-and-output
Open

Improve performance and output of pyenv virtualenvs#502
samdoran wants to merge 17 commits intopyenv:masterfrom
samdoran:improve-performance-and-output

Conversation

@samdoran
Copy link
Copy Markdown

@samdoran samdoran commented Feb 13, 2025

The biggest change is reusing most of the code used for pyenv versions in pyenv virtualenvs. This dramatically improves performance while making the output consistent.

Related to #490. Maybe fixes the problem?

With 128 virtual environments, it currently takes about 13 seconds to run pyenv virtualenvs --bare.

> time pyenv virtualenvs --bare > /dev/null 2>&1

________________________________________________________
Executed in   13.14 secs    fish           external
   usr time    6.32 secs    0.33 millis    6.32 secs
   sys time    6.13 secs    2.19 millis    6.13 secs
Output
1brc
3.10.13/envs/instruct-lab
3.10.13/envs/parquet-compactor-3.10.13
3.10.14/envs/ipython-3.10.14
3.10.15/envs/ipython-3.10.15
3.10.7/envs/cherry_picker-3.10.7
3.10.9/envs/pyls-3.10.9
3.11.0/envs/argcomplete-3.11.0
3.11.0/envs/asciinema-3.11.0
3.11.0/envs/borg-3.11.0
3.11.0/envs/cherry_picker-3.11.0
3.11.0/envs/cookiecutter-3.11.0
3.11.0/envs/diceware-3.11.0
3.11.0/envs/flake8-3.11.0
3.11.0/envs/ipdb-3.11.0
3.11.0/envs/isort-3.11.0
3.11.0/envs/jello-3.11.0
3.11.0/envs/mackup-3.11.0
3.11.0/envs/maestral-3.11.0
3.11.0/envs/mitmproxy-3.11.0
3.11.0/envs/mypy-3.11.0
3.11.0/envs/pipfile2req-3.11.0
3.11.0/envs/pur-3.11.0
3.11.0/envs/pylint-3.11.0
3.11.0/envs/pyspy-3.11.0
3.11.0/envs/pytest-3.11.0
3.11.0/envs/qrimg-3.11.0
3.11.0/envs/shiv-3.11.0
3.11.0/envs/speedtest-cli-3.11.0
3.11.0/envs/sphinx-3.11.0
3.11.0/envs/tox-3.11.0
3.11.0/envs/tweet-delete-3.11.0
3.11.0/envs/yamllint-3.11.0
3.11.0/envs/youtube-dl-3.11.0
3.11.1/envs/borg-3.11.1
3.11.1/envs/qontract-3.11.1
3.11.1/envs/requests-3.11.1
3.11.1/envs/titlecase-3.11.1
3.11.1/envs/uptime-kuma-3.11.1
3.11.10/envs/ipython-3.11.10
3.11.10/envs/koku-dev-3.11.10
3.11.10/envs/koku-test
3.11.2/envs/bonfire-3.11.2
3.11.2/envs/testing
3.11.3/envs/ansible-dev-3.11.3
3.11.3/envs/qr-coding-3.11.3
3.11.4/envs/flash
3.11.4/envs/json-linter-3.11.4
3.11.4/envs/youtube-dl-dev
3.11.5/envs/parquet-compactor-3.11.5
3.11.6/envs/ansible-core-3.11.6
3.11.6/envs/pre-commit
3.11.6/envs/pylibssh-dev-3.11.6
3.11.6/envs/tasmota-3.11.6
3.11.7/envs/pipenv-3.11.7
3.11.7/envs/tasmota-3.11.7
3.11.8/envs/cffi-dev-3.11.8
3.11.8/envs/koku-dev-3.11.8
3.11.8/envs/koku-dev-dj4-3.11.8
3.11.9/envs/ipython-3.11.9
3.11.9/envs/koku-dev-3.11.9
3.11.9/envs/nise-populator-3.11.9
3.12.0/envs/ansible-core-3.12.0
3.12.0/envs/cla-dev-3.12.0
3.12.0/envs/ipython-3.12.0
3.12.0/envs/jupyter
3.12.0/envs/koku-metrics-operator-3.12.0
3.12.0/envs/pytorch
3.12.0/envs/requests-3.12.0
3.12.0/envs/rh-pre-commit-3.12.0
3.12.1/envs/ipython-3.12.1
3.12.2/envs/1brc
3.12.2/envs/ansible-core-3.12.2
3.12.2/envs/black
3.12.2/envs/cffi-dev-3.12.2
3.12.2/envs/codecov-cli
3.12.2/envs/dr-content-3.12.2
3.12.2/envs/harlequin
3.12.2/envs/ipython-3.12.2
3.12.2/envs/pip-audit
3.12.2/envs/pygments-3.12.2
3.12.2/envs/pyright
3.12.2/envs/qrcode
3.12.2/envs/ruff
3.12.3/envs/ipython-3.12.3
3.12.5/envs/ipython-3.12.5
3.12.5/envs/shellai
3.12.6/envs/build-definitions
3.12.6/envs/ipython-3.12.6
3.12.6/envs/kflux-rel-data
3.12.7/envs/aoc-2024
3.12.7/envs/ipython-3.12.7
3.12.8/envs/dr-backend-3.12.8
3.12.8/envs/ipython-3.12.8
3.12.8/envs/lifecycle-defs
3.12.8/envs/rlsapi-dev
3.12.8/envs/rlsrag
3.13.0/envs/cffi-3.13.0
3.13.0/envs/cicd-tools
3.13.0/envs/ipython-3.13.0
3.13.0/envs/thefuck
3.13.1/envs/docling
3.13.1/envs/httpie
3.13.1/envs/ipython-3.13.1
3.13.1/envs/llm
3.13.1/envs/locust
3.13.1/envs/poetry
3.13.1/envs/prefix
3.13.1/envs/tox
3.6.15/envs/ipython-3.6.15
3.7.15/envs/ipython-3.7.15
3.7.16/envs/ipython-3.7.16
3.8.14/envs/ansible-dev-3.8.14
3.8.15/envs/ipython-3.8.15
3.8.15/envs/nise-populator-3.8.15
3.8.16/envs/koku-nise-dev-3.8.16
3.8.17/envs/ipython-3.8.17
3.8.18/envs/parquet-compactor-3.8.18
3.8.20/envs/ipython-3.8.20
3.9.14/envs/iqe-3.9.14
3.9.15/envs/ipython-3.9.15
3.9.16/envs/koku-dev-logging-3.9.16
3.9.17/envs/event-sign-3.9.17
3.9.17/envs/ipython-3.9.17
3.9.18/envs/koku-dev-3.9.18
3.9.18/envs/koku-rediscache-debug
3.9.18/envs/parquet-compactor-3.9.18
3.9.19/envs/ipython-3.9.19
3.9.19/envs/koku-dev-3.9.19
ansible-core-3.11.6
ansible-core-3.12.0
ansible-core-3.12.2
ansible-dev-3.11.3
ansible-dev-3.8.14
aoc-2024
argcomplete-3.11.0
asciinema-3.11.0
black
bonfire-3.11.2
borg-3.11.0
borg-3.11.1
build-definitions
cffi-3.13.0
cffi-dev-3.11.8
cffi-dev-3.12.2
cherry_picker-3.10.7
cherry_picker-3.11.0
cicd-tools
cla-dev-3.12.0
codecov-cli
cookiecutter-3.11.0
diceware-3.11.0
docling
dr-backend-3.12.8
dr-content-3.12.2
event-sign-3.9.17
flake8-3.11.0
flash
harlequin
httpie
instruct-lab
ipdb-3.11.0
ipython-3.10.14
ipython-3.10.15
ipython-3.11.10
ipython-3.11.9
ipython-3.12.0
ipython-3.12.1
ipython-3.12.2
ipython-3.12.3
ipython-3.12.5
ipython-3.12.6
ipython-3.12.7
ipython-3.12.8
ipython-3.13.0
ipython-3.13.1
ipython-3.6.15
ipython-3.7.15
ipython-3.7.16
ipython-3.8.15
ipython-3.8.17
ipython-3.8.20
ipython-3.9.15
ipython-3.9.17
ipython-3.9.19
iqe-3.9.14
isort-3.11.0
jello-3.11.0
json-linter-3.11.4
jupyter
kflux-rel-data
koku-dev-3.11.10
koku-dev-3.11.8
koku-dev-3.11.9
koku-dev-3.9.18
koku-dev-3.9.19
koku-dev-dj4-3.11.8
koku-dev-logging-3.9.16
koku-metrics-operator-3.12.0
koku-nise-dev-3.8.16
koku-rediscache-debug
koku-test
lifecycle-defs
llm
locust
mackup-3.11.0
maestral-3.11.0
mitmproxy-3.11.0
mypy-3.11.0
nise-populator-3.11.9
nise-populator-3.8.15
parquet-compactor-3.10.13
parquet-compactor-3.11.5
parquet-compactor-3.8.18
parquet-compactor-3.9.18
pip-audit
pipenv-3.11.7
pipfile2req-3.11.0
poetry
pre-commit
prefix
pur-3.11.0
pygments-3.12.2
pylibssh-dev-3.11.6
pylint-3.11.0
pyls-3.10.9
pyright
pyspy-3.11.0
pytest-3.11.0
pytorch
qontract-3.11.1
qr-coding-3.11.3
qrcode
qrimg-3.11.0
requests-3.11.1
requests-3.12.0
rh-pre-commit-3.12.0
rlsapi-dev
rlsrag
ruff
shellai
shiv-3.11.0
speedtest-cli-3.11.0
sphinx-3.11.0
tasmota-3.11.6
tasmota-3.11.7
testing
thefuck
titlecase-3.11.1
tox
tox-3.11.0
tweet-delete-3.11.0
uptime-kuma-3.11.1
yamllint-3.11.0
youtube-dl-3.11.0
youtube-dl-dev

With the changes in this branch it is 236ms:

> time pyenv virtualenvs --bare > /dev/null 2>&1

________________________________________________________
Executed in  236.02 millis    fish           external
   usr time   36.14 millis    0.31 millis   35.83 millis
   sys time   31.66 millis    3.17 millis   28.48 millis
Output
3.10.13/envs/instruct-lab
3.10.13/envs/parquet-compactor-3.10.13
3.10.14/envs/ipython-3.10.14
3.10.15/envs/ipython-3.10.15
3.10.7/envs/cherry_picker-3.10.7
3.10.9/envs/pyls-3.10.9
3.11.0/envs/argcomplete-3.11.0
3.11.0/envs/asciinema-3.11.0
3.11.0/envs/borg-3.11.0
3.11.0/envs/cherry_picker-3.11.0
3.11.0/envs/cookiecutter-3.11.0
3.11.0/envs/diceware-3.11.0
3.11.0/envs/flake8-3.11.0
3.11.0/envs/ipdb-3.11.0
3.11.0/envs/isort-3.11.0
3.11.0/envs/jello-3.11.0
3.11.0/envs/mackup-3.11.0
3.11.0/envs/maestral-3.11.0
3.11.0/envs/mitmproxy-3.11.0
3.11.0/envs/mypy-3.11.0
3.11.0/envs/pipfile2req-3.11.0
3.11.0/envs/pur-3.11.0
3.11.0/envs/pylint-3.11.0
3.11.0/envs/pyspy-3.11.0
3.11.0/envs/pytest-3.11.0
3.11.0/envs/qrimg-3.11.0
3.11.0/envs/shiv-3.11.0
3.11.0/envs/speedtest-cli-3.11.0
3.11.0/envs/sphinx-3.11.0
3.11.0/envs/tox-3.11.0
3.11.0/envs/tweet-delete-3.11.0
3.11.0/envs/yamllint-3.11.0
3.11.0/envs/youtube-dl-3.11.0
3.11.1/envs/borg-3.11.1
3.11.1/envs/qontract-3.11.1
3.11.1/envs/requests-3.11.1
3.11.1/envs/titlecase-3.11.1
3.11.1/envs/uptime-kuma-3.11.1
3.11.10/envs/ipython-3.11.10
3.11.10/envs/koku-dev-3.11.10
3.11.10/envs/koku-test
3.11.2/envs/bonfire-3.11.2
3.11.2/envs/testing
3.11.3/envs/ansible-dev-3.11.3
3.11.3/envs/qr-coding-3.11.3
3.11.4/envs/flash
3.11.4/envs/json-linter-3.11.4
3.11.4/envs/youtube-dl-dev
3.11.5/envs/parquet-compactor-3.11.5
3.11.6/envs/ansible-core-3.11.6
3.11.6/envs/pre-commit
3.11.6/envs/pylibssh-dev-3.11.6
3.11.6/envs/tasmota-3.11.6
3.11.7/envs/pipenv-3.11.7
3.11.7/envs/tasmota-3.11.7
3.11.8/envs/cffi-dev-3.11.8
3.11.8/envs/koku-dev-3.11.8
3.11.8/envs/koku-dev-dj4-3.11.8
3.11.9/envs/ipython-3.11.9
3.11.9/envs/koku-dev-3.11.9
3.11.9/envs/nise-populator-3.11.9
3.12.0/envs/ansible-core-3.12.0
3.12.0/envs/cla-dev-3.12.0
3.12.0/envs/ipython-3.12.0
3.12.0/envs/jupyter
3.12.0/envs/koku-metrics-operator-3.12.0
3.12.0/envs/pytorch
3.12.0/envs/requests-3.12.0
3.12.0/envs/rh-pre-commit-3.12.0
3.12.1/envs/ipython-3.12.1
3.12.2/envs/1brc
3.12.2/envs/ansible-core-3.12.2
3.12.2/envs/black
3.12.2/envs/cffi-dev-3.12.2
3.12.2/envs/codecov-cli
3.12.2/envs/dr-content-3.12.2
3.12.2/envs/harlequin
3.12.2/envs/ipython-3.12.2
3.12.2/envs/pip-audit
3.12.2/envs/pygments-3.12.2
3.12.2/envs/pyright
3.12.2/envs/qrcode
3.12.2/envs/ruff
3.12.3/envs/ipython-3.12.3
3.12.5/envs/ipython-3.12.5
3.12.5/envs/shellai
3.12.6/envs/build-definitions
3.12.6/envs/ipython-3.12.6
3.12.6/envs/kflux-rel-data
3.12.7/envs/aoc-2024
3.12.7/envs/ipython-3.12.7
3.12.8/envs/dr-backend-3.12.8
3.12.8/envs/ipython-3.12.8
3.12.8/envs/lifecycle-defs
3.12.8/envs/rlsapi-dev
3.12.8/envs/rlsrag
3.13.0/envs/cffi-3.13.0
3.13.0/envs/cicd-tools
3.13.0/envs/ipython-3.13.0
3.13.0/envs/thefuck
3.13.1/envs/docling
3.13.1/envs/httpie
3.13.1/envs/ipython-3.13.1
3.13.1/envs/llm
3.13.1/envs/locust
3.13.1/envs/poetry
3.13.1/envs/prefix
3.13.1/envs/tox
3.6.15/envs/ipython-3.6.15
3.7.15/envs/ipython-3.7.15
3.7.16/envs/ipython-3.7.16
3.8.14/envs/ansible-dev-3.8.14
3.8.15/envs/ipython-3.8.15
3.8.15/envs/nise-populator-3.8.15
3.8.16/envs/koku-nise-dev-3.8.16
3.8.17/envs/ipython-3.8.17
3.8.18/envs/parquet-compactor-3.8.18
3.8.20/envs/ipython-3.8.20
3.9.14/envs/iqe-3.9.14
3.9.15/envs/ipython-3.9.15
3.9.16/envs/koku-dev-logging-3.9.16
3.9.17/envs/event-sign-3.9.17
3.9.17/envs/ipython-3.9.17
3.9.18/envs/koku-dev-3.9.18
3.9.18/envs/koku-rediscache-debug
3.9.18/envs/parquet-compactor-3.9.18
3.9.19/envs/ipython-3.9.19
3.9.19/envs/koku-dev-3.9.19
1brc
ansible-core-3.11.6
ansible-core-3.12.0
ansible-core-3.12.2
ansible-dev-3.11.3
ansible-dev-3.8.14
aoc-2024
argcomplete-3.11.0
asciinema-3.11.0
black
bonfire-3.11.2
borg-3.11.0
borg-3.11.1
build-definitions
cffi-3.13.0
cffi-dev-3.11.8
cffi-dev-3.12.2
cherry_picker-3.10.7
cherry_picker-3.11.0
cicd-tools
cla-dev-3.12.0
codecov-cli
cookiecutter-3.11.0
diceware-3.11.0
docling
dr-backend-3.12.8
dr-content-3.12.2
event-sign-3.9.17
flake8-3.11.0
flash
harlequin
httpie
instruct-lab
ipdb-3.11.0
ipython-3.10.14
ipython-3.10.15
ipython-3.11.10
ipython-3.11.9
ipython-3.12.0
ipython-3.12.1
ipython-3.12.2
ipython-3.12.3
ipython-3.12.5
ipython-3.12.6
ipython-3.12.7
ipython-3.12.8
ipython-3.13.0
ipython-3.13.1
ipython-3.6.15
ipython-3.7.15
ipython-3.7.16
ipython-3.8.15
ipython-3.8.17
ipython-3.8.20
ipython-3.9.15
ipython-3.9.17
ipython-3.9.19
iqe-3.9.14
isort-3.11.0
jello-3.11.0
json-linter-3.11.4
jupyter
kflux-rel-data
koku-dev-3.11.10
koku-dev-3.11.8
koku-dev-3.11.9
koku-dev-3.9.18
koku-dev-3.9.19
koku-dev-dj4-3.11.8
koku-dev-logging-3.9.16
koku-metrics-operator-3.12.0
koku-nise-dev-3.8.16
koku-rediscache-debug
koku-test
lifecycle-defs
llm
locust
mackup-3.11.0
maestral-3.11.0
mitmproxy-3.11.0
mypy-3.11.0
nise-populator-3.11.9
nise-populator-3.8.15
parquet-compactor-3.10.13
parquet-compactor-3.11.5
parquet-compactor-3.8.18
parquet-compactor-3.9.18
pip-audit
pipenv-3.11.7
pipfile2req-3.11.0
poetry
pre-commit
prefix
pur-3.11.0
pygments-3.12.2
pylibssh-dev-3.11.6
pylint-3.11.0
pyls-3.10.9
pyright
pyspy-3.11.0
pytest-3.11.0
pytorch
qontract-3.11.1
qr-coding-3.11.3
qrcode
qrimg-3.11.0
requests-3.11.1
requests-3.12.0
rh-pre-commit-3.12.0
rlsapi-dev
rlsrag
ruff
shellai
shiv-3.11.0
speedtest-cli-3.11.0
sphinx-3.11.0
tasmota-3.11.6
tasmota-3.11.7
testing
thefuck
titlecase-3.11.1
tox
tox-3.11.0
tweet-delete-3.11.0
uptime-kuma-3.11.1
yamllint-3.11.0
youtube-dl-3.11.0
youtube-dl-dev

Output formatting changes

This PR also includes changes to the output format to make it more consistent with pyenv versions.

The completions for pyenv virtualenv now omit envs.

@samdoran
Copy link
Copy Markdown
Author

I could use some help getting the tests correct. I made a few changes but I don't understand why the unstub commands were failing or how to get a virtual env to show up as "activated" in the test environment.

@pyenv pyenv deleted a comment from samdoran Feb 13, 2025
@ChristianFredrikJohnsen
Copy link
Copy Markdown

Seems like only two tests are failing 😄

I just randomly checked into virtualenv. I recently did some perf improvements on the main pyenv repo, and I found myself spending more work fixing the tests (and understanding bats, etc.) than actually improving the source code.
In the pyenv repo, I found that some parts of the code were just written to enable tests to pass, and had no actual value beyond that.

I am not sure if this applies to your situation as well, haven't looked much into it. The main idea I have is:

The code may be perfectly fine, but the tests can be a mess!

@samdoran
Copy link
Copy Markdown
Author

The tests do need some adjusting since I've changed the output a bit. I'm just having a hard time figuring out what exactly stub and unstub do as well as how to "activate" a venv in the test environment. Testing is always the hard part.

@ChristianFredrikJohnsen
Copy link
Copy Markdown

Hehe, and the test file hasn't been touched in 10 years 😆
Same thing I ran into in the pyenv project. Probably only the guy who initially created this stuff knows.

I did not encounter stub and unstub when I did testing in pyenv, and there was no activate there as well (since no virtualenvs of course). Yeah, I don't have any quick answers 💀 It's a pain 🥲

@samdoran
Copy link
Copy Markdown
Author

The code itself that was the source of the performance issue is 10-12 years old. Not that old code is bad, but there were some inefficiencies in there.

@ChristianFredrikJohnsen
Copy link
Copy Markdown

No it's not that the old code is bad. It was probably good at the time it was written. It's more of a problem that the code has design principles which made sense back then, but fast forward 10 years and it's not as intuitive anymore.

And if you're unlucky, you're facing tests which were quick-fix set up 10 years ago, and suddenly you need to fix the problem of ...
Not necessarily the problem of any one person either, it's just that the entire structure doesn't feel intuitive.

It's a challenge for sure 😄

Comment thread bin/pyenv-virtualenvs
Comment thread bin/pyenv-virtualenvs Outdated
Comment thread bin/pyenv-virtualenvs Outdated
Comment thread bin/pyenv-virtualenvs Outdated
Comment thread test/virtualenvs.bats Outdated
Comment thread test/virtualenvs.bats Outdated
Comment thread test/virtualenvs.bats Outdated
Comment thread test/virtualenvs.bats Outdated
Comment thread bin/pyenv-activate Outdated
Comment thread bin/pyenv-sh-activate Outdated
@samdoran
Copy link
Copy Markdown
Author

Thank you for the feedback @native-api. I'll address this later in the week.

@samdoran
Copy link
Copy Markdown
Author

I had a crazy week and a full weekend away from home. I will work on this during the week.

@samdoran
Copy link
Copy Markdown
Author

Thanks for all the feedback. I didn't get to fixing up the tests. I need to get some sleep for now.

@lcrownover
Copy link
Copy Markdown

Did this get dropped? Would love a speedup on virtualenvs 👍

@samdoran
Copy link
Copy Markdown
Author

I have not forgotten about this. My day job has consumed all my capacity lately so I haven't circled back to address the test failures.

I'm kinda cheating because I started using the changes in this branch locally so haven't felt the pain in a while.

@jakelodwick
Copy link
Copy Markdown
Contributor

The prompt hook performance issue (#259) is fixed in v1.3.0 via #523, which caches the active version to skip redundant activate calls. This PR targets a different surface area: pyenv virtualenvs listing performance. @samdoran's work here on reducing the per-venv cost of pyenv-virtualenv-prefix may still have value independently.

@samdoran
Copy link
Copy Markdown
Author

I'll try out the fixes in v1.3.0 and see how they affect the issue I was seeing. Thanks for the improvements you made.

@samdoran
Copy link
Copy Markdown
Author

So it does seem like this helps with the prompt completion, but pyenv virtualenvs is still quite slow and would benefit from the changes in this PR.

@samdoran samdoran force-pushed the improve-performance-and-output branch 2 times, most recently from bdcfb08 to cbaa29a Compare April 15, 2026 17:02
@samdoran
Copy link
Copy Markdown
Author

Sorry this took so long, but I finally circled back and got the tests in order. I fixed some existing issues and added more tests cases. Please review when you have a chance. Thank you!

@samdoran
Copy link
Copy Markdown
Author

Thanks for fixing those things up.

Comment thread bin/pyenv-virtualenv Outdated
Comment thread bin/pyenv-virtualenvs
Use the code from pyenv-versions for efficiency and consistent output.

The main performance problem was in the call to pyenv-virtualenv-prefix,
which called pyenv-prefix, which then enumerated every virtual environment.
This was done inside a loop, compounding the problem.

Simply the virtual environment listing so that it does not have to call
pyenv-virtualenv-prefix anymore.
This is useful for listing the “frinedly” virtualenv names instead of
the short path which includes the Python version.
…vironments

Having the current virtual environments listed as options in the competion
is noisy since only bare Python versions, such as 3.11.1, make sense as
suggested completions for `pyenv virtualenv [version]`.
This makes the suggested completetions cleaner.
samdoran and others added 11 commits April 20, 2026 13:23
This was removed by accident.
For consistency, use conditional expressions instead of
arithmetic evaluation when comparing bash versions.
The new implementation is not using realpath.
Update the existing tests based on new behavior/output format.
Add additional tests to cover scenarios that were not previously tested.
While it looks a bit funny, it is valid to use an existing virtual
environment as the [version] when creating a new one.
@samdoran samdoran force-pushed the improve-performance-and-output branch from 894a488 to 64b8644 Compare April 20, 2026 17:51
Comment thread test/virtualenvs.bats
Comment on lines -43 to -44
venv27 (created from /usr)
* venv33 (created from /usr)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Base environment is critical information for an env. Unless you have rationale for it, it should stay.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Calling pyenv-virtualenv-prefix in order to get that information is a huge source of the performance problem. I'll see if I can find a more efficient way of getting that information.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, I think that is the source of the performance problems. With 160 virtual environments, calling pyenv-virtualenv-prefix to get the base environment increases the total output time from 665 ms to 12 s.

> pyenv virtualenvs --skip-aliases | wc -l
     160

> time pyenv virtualenvs > /dev/null 2>&1

________________________________________________________
Executed in   12.73 secs    fish           external
   usr time    5.99 secs    0.20 millis    5.99 secs
   sys time    6.11 secs    1.14 millis    6.11 secs

# omitting the base environment lookup with pyenv-virtualenv-prefix
> time pyenv virtualenvs > /dev/null 2>&1

________________________________________________________
Executed in  664.70 millis    fish           external
   usr time  168.56 millis  189.00 micros  168.37 millis
   sys time  195.23 millis  889.00 micros  194.34 millis

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see that pyenv-virtualenv-prefix accepts multiple arguments. Would calling it just once help?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants