From 44c20af80ec1d4d83f86c03d72949416ac858173 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Thu, 13 Mar 2014 14:59:33 +0100 Subject: [PATCH] Optimize pyenv-which: implement remove_from_path in Bash This greatly improves the performance of `pyenv virtualenvwrapper_lazy`, which happens to call pyenv-which a lot. For profiling I've initially used: % zmodload zsh/zprof % eval "$(pyenv init -)" % pyenv virtualenvwrapper_lazy Before: % zprof|grep -E '(pyenv|virtualenv)' 1) 1 754,07 754,07 58,95% 751,50 751,50 58,75% pyenv 21) 1 2,57 2,57 0,20% 2,57 2,57 0,20% virtualenvwrapper_setup_lazy_loader 1) 1 754,07 754,07 58,95% 751,50 751,50 58,75% pyenv 1/1 2,57 2,57 0,20% 2,57 2,57 virtualenvwrapper_setup_lazy_loader [21] 1/1 2,57 2,57 0,20% 2,57 2,57 pyenv [1] 21) 1 2,57 2,57 0,20% 2,57 2,57 0,20% virtualenvwrapper_setup_lazy_loader After: % zprof|grep -E '(pyenv|virtualenv)' 1) 1 383,30 383,30 27,97% 380,88 380,88 27,79% pyenv 31) 1 2,42 2,42 0,18% 2,42 2,42 0,18% virtualenvwrapper_setup_lazy_loader 1) 1 383,30 383,30 27,97% 380,88 380,88 27,79% pyenv 1/1 2,42 2,42 0,18% 2,42 2,42 virtualenvwrapper_setup_lazy_loader [31] 1/1 2,42 2,42 0,18% 2,42 2,42 pyenv [1] 31) 1 2,42 2,42 0,18% 2,42 2,42 0,18% virtualenvwrapper_setup_lazy_loader Fixes https://github.com/yyuu/pyenv-virtualenvwrapper/issues/13 --- libexec/pyenv-which | 40 +++++----------------------------------- 1 file changed, 5 insertions(+), 35 deletions(-) diff --git a/libexec/pyenv-which b/libexec/pyenv-which index 8e2a6f4e..c5e06978 100755 --- a/libexec/pyenv-which +++ b/libexec/pyenv-which @@ -15,39 +15,6 @@ if [ "$1" = "--complete" ]; then exec pyenv shims --short fi -expand_path() { - if [ ! -d "$1" ]; then - return 1 - fi - - local cwd="$(pwd)" - cd "$1" - pwd - cd "$cwd" -} - -remove_from_path() { - local path_to_remove="$(expand_path "$1")" - local result="" - - if [ -z "$path_to_remove" ]; then - echo "${PATH}" - return - fi - - local paths - IFS=: paths=($PATH) - - for path in "${paths[@]}"; do - path="$(expand_path "$path" || true)" - if [ -n "$path" ] && [ "$path" != "$path_to_remove" ]; then - result="${result}${path}:" - fi - done - - echo "${result%:}" -} - OLDIFS="$IFS" IFS=: versions=($(pyenv-version-name)) IFS=: PYENV_VERSION="${versions[*]}" @@ -61,8 +28,11 @@ fi for version in "${versions[@]}"; do if [ "$version" = "system" ]; then - PATH="$(remove_from_path "${PYENV_ROOT}/shims")" - PYENV_COMMAND_PATH="$(command -v "$PYENV_COMMAND" || true)" + # Remove shims from PATH: + _path=":$PATH:" + _remove="${PYENV_ROOT}/shims" + _path="${_path//:$_remove:/:}" + PYENV_COMMAND_PATH="$(PATH=$_path command -v "$PYENV_COMMAND" || true)" else PYENV_COMMAND_PATH="${PYENV_ROOT}/versions/${version}/bin/${PYENV_COMMAND}" fi