Skip to content

Improve performance and output of pyenv virtualenvs#502

Merged
native-api merged 35 commits intopyenv:masterfrom
samdoran:improve-performance-and-output
Apr 29, 2026
Merged

Improve performance and output of pyenv virtualenvs#502
native-api merged 35 commits intopyenv:masterfrom
samdoran:improve-performance-and-output

Conversation

@samdoran
Copy link
Copy Markdown
Contributor

@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 2.9s:

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

________________________________________________________
Executed in    2.90 secs    fish           external
   usr time    1.28 secs    0.31 millis    1.28 secs
   sys time    1.38 secs    1.29 millis    1.38 secs
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
Contributor 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
Contributor 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
Contributor 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
Contributor Author

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

@samdoran
Copy link
Copy Markdown
Contributor 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
Contributor 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
Contributor 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
Contributor 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
Contributor 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
Contributor 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
Contributor Author

Thanks for fixing those things up.

Comment thread bin/pyenv-virtualenv Outdated
Comment thread bin/pyenv-virtualenvs
@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
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.
@native-api
Copy link
Copy Markdown
Member

I think this is good enough to merge.

Aren't you forgetting something? ;-)

The echo "${VIRTUALENV_PREFIX_PATHS[*]}" statement at the end of the file
only worked by accident because IFS=: was set earlier in the file.

Properly set/unset IFS.
@samdoran
Copy link
Copy Markdown
Contributor Author

Doh, let me see what's up with the test failures.

This refelects how call changes have changed in the code.
@samdoran
Copy link
Copy Markdown
Contributor Author

I needed to remove the pyenv-prefix stubs since that isn't called anymore. Tests should pass now.

Comment thread test/virtualenvs.bats
Comment thread test/virtualenvs.bats Outdated
Comment thread test/virtualenvs.bats Outdated
The warning was removed, so testing no empty output doesn’t make much sense.
Also have create_m_venv call setup_m_venv.
Venvs created from system Python are directories, not sym links. The previous
code only displayed venvs that were a directory and a symlink. Now check for
directory existence and symlink status, or directory existence and the presence
of bin/activate within the directory.
This was only used by the warning code, which was removed.
Change the main setup to only set PYENV_ROOT. Each test now sets up the
required virtual environments. This results in some duplication but makes
it clearer what each test is doing.

An alternative approach would be to modify the venv created by create_m_venv to
make it look like a system venv, but two distinct functions make it much clearer
what they are doing even though there is some overlap between the functions.
@samdoran
Copy link
Copy Markdown
Contributor Author

samdoran commented Apr 27, 2026

The tests should pass. 😁

> bats test/
...
111 tests, 0 failures

@samdoran
Copy link
Copy Markdown
Contributor Author

I added a test to prevent performance regressions. I can omit that if you think it's excessive.

Also stub out calls to pyenv-virtualenv-prefix in the test that’s listing venvs.
Making this an integration test ended up giving mixed results.
This test when run without the performance changes in this branch did
not reflect the performance gains seen when running pyenv-virtualenvs
outside of the test environment. The test was not accomplishing its goal.
@samdoran
Copy link
Copy Markdown
Contributor Author

samdoran commented Apr 28, 2026

After running the performance test on master and comparing the results, I removed it. The tests use stub to mock external calls in order to make them unit tests. Trying to create a performance test is opening the scope into an integration test and I could not confidently get the tests stubs to do what I thought they should.

no longer needed now that PYENV_ROOT is under BATS_TEST_DIRNAME
@native-api native-api merged commit 37ab83f into pyenv:master Apr 29, 2026
6 checks passed
@native-api
Copy link
Copy Markdown
Member

Okay, as a highly-requested change, this qualifies for a payout from donated money (tax-exempt). If you are interested, please register at https://opencollective.com and provide your handle name so I can set it up.

@samdoran samdoran deleted the improve-performance-and-output branch April 29, 2026 13:04
@samdoran
Copy link
Copy Markdown
Contributor Author

Thank you so much for working with me through this.

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