Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Slow completion for python-igraph depending on current working directory #1118

Open
ilekka opened this issue Dec 27, 2023 · 3 comments
Open

Comments

@ilekka
Copy link

ilekka commented Dec 27, 2023

Issue

Completions for python-igraph are typically very slow, but the speed depends drastically on the current working directory.

If vim is run in ~, the code

from igraph import Graph
g = Graph()
g.

takes over 30 seconds to complete. The completion becomes faster if the current working directory is better isolated from other directories. (The examples below will hopefully help to clarify what I mean by this; unfortunately I don't know how to give a precise characterization of "isolated".)

Steps to reproduce

After cd'ing into the following directories:

  1. ~
  2. ~/Python/empty (an empty directory, but ~/Python contains all my Python projects and scripts)
  3. ~/empty/directory/with/no/python/anywhere/in/sight

I start vim and type the code

from igraph import Graph
g = Graph()
g.

In case 1, the completion takes over 30 seconds, in case 2 it takes about 3 seconds, and in case 3 it happens basically instantaneously.

Tab completion in ipython is instantaneous in all three cases.

Vim is run with a minimal .vimrc that uses vim-plug to load only jedi-vim:

set nocompatible

call plug#begin()
Plug 'davidhalter/jedi-vim'
call plug#end()

Output of “:verbose JediDebugInfo”

Jedi-vim debug information

jedi-vim version
  • jedi-vim git version: b82da7d
  • jedi git submodule status: 4e175ca82bbd680cb90f462545c10a8b1c0b5f2e pythonx/jedi (v0.19.1)
  • parso git submodule status: ee5edaf22ff3941cbdfa4efd8cb3e8f69779fd56 pythonx/parso (v0.8.3)
Global Python

Using Python version 3 to access Jedi.

  • global sys.executable: /home/ilkka/mambaforge/envs/3.11/bin/python3
  • global sys.version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
  • global site module: /home/ilkka/mambaforge/lib/python3.10/site.py
Jedi
  • path: /home/ilkka/.vim/plugged/jedi-vim/pythonx/jedi/jedi/__init__.py
  • version: 0.19.1
Jedi environment: <Environment: 3.11.7 in /home/ilkka/mambaforge/envs/3.11>
  • executable: /home/ilkka/mambaforge/envs/3.11/bin/python
  • sys_path:
    • /home/ilkka/mambaforge/envs/3.11/lib/python311.zip
    • /home/ilkka/mambaforge/envs/3.11/lib/python3.11
    • /home/ilkka/mambaforge/envs/3.11/lib/python3.11/lib-dynload
    • /home/ilkka/mambaforge/envs/3.11/lib/python3.11/site-packages
Known environments
  • <Environment: 3.11.7 in /home/ilkka/mambaforge/envs/3.11> (/home/ilkka/mambaforge/envs/3.11/bin/python)

  • <Environment: 3.11.7 in /home/ilkka/mambaforge/envs/3.11> (/home/ilkka/mambaforge/envs/3.11/bin/python3.11)

  • <Environment: 3.10.12 in /usr> (/usr/bin/python3.10)

Settings
  omnifunc=jedi#completions
	Last set from ~/.vim/plugged/jedi-vim/autoload/jedi.vim line 723
  completeopt=menuone,longest,popup
	Last set from ~/.vim/plugged/jedi-vim/autoload/jedi.vim line 701

:version


VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Dec 05 2023 17:58:57)
Included patches: 1-579, 1969, 580-1848, 4975, 5016, 5023, 5072, 2068, 1849-1854, 1857, 1855-1857, 1331, 1858, 1858-1859, 1873, 1860-1969, 1992, 1970-1992, 2010, 1993-2068, 2106, 2069-2106, 2108, 2107-2109, 2109-3995, 4563, 4646, 4774, 4895, 4899, 4901, 4919, 213, 1840, 1846-1847, 2110-2112, 2121
Modified by [email protected]
Compiled by [email protected]
Huge version with GTK3 GUI.  Features included (+) or not (-):
+acl               +dnd               +listcmds          +postscript        +termresponse
+arabic            -ebcdic            +localmap          +printer           +textobjects
+autocmd           +emacs_tags        +lua               +profile           +textprop
+autochdir         +eval              +menu              -python            +timers
-autoservername    +ex_extra          +mksession         +python3           +title
+balloon_eval      +extra_search      +modify_fname      +quickfix          +toolbar
+balloon_eval_term -farsi             +mouse             +reltime           +user_commands
+browse            +file_in_path      +mouseshape        +rightleft         +vartabs
++builtin_terms    +find_in_path      +mouse_dec         +ruby              +vertsplit
+byte_offset       +float             +mouse_gpm         +scrollbind        +vim9script
+channel           +folding           -mouse_jsbterm     +signs             +viminfo
+cindent           -footer            +mouse_netterm     +smartindent       +virtualedit
+clientserver      +fork()            +mouse_sgr         +sodium            +visual
+clipboard         +gettext           -mouse_sysmouse    +sound             +visualextra
+cmdline_compl     -hangul_input      +mouse_urxvt       +spell             +vreplace
+cmdline_hist      +iconv             +mouse_xterm       +startuptime       +wildignore
+cmdline_info      +insert_expand     +multi_byte        +statusline        +wildmenu
+comments          +ipv6              +multi_lang        -sun_workshop      +windows
+conceal           +job               -mzscheme          +syntax            +writebackup
+cryptv            +jumplist          +netbeans_intg     +tag_binary        +X11
+cscope            +keymap            +num64             -tag_old_static    -xfontset
+cursorbind        +lambda            +packages          -tag_any_white     +xim
+cursorshape       +langmap           +path_extra        +tcl               +xpm
+dialog_con_gui    +libcall           +perl              +termguicolors     +xsmp_interact
+diff              +linebreak         +persistent_undo   +terminal          +xterm_clipboard
+digraphs          +lispindent        +popupwin          +terminfo          -xterm_save
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
  system gvimrc file: "$VIM/gvimrc"
    user gvimrc file: "$HOME/.gvimrc"
2nd user gvimrc file: "~/.vim/gvimrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
    system menu file: "$VIMRUNTIME/menu.vim"
  fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/harfbuzz -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/x86_64-linux-gnu -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -Wdate-time -g -O2 -ffile-prefix-map=/build/vim-gVT2fw/vim-8.2.3995=. -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -D_REENTRANT -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 
Linking: gcc -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -flto=auto -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -ltinfo -lselinux -lcanberra -lsodium -lacl -lattr -lgpm -L/usr/lib -llua5.2 -Wl,-E -fstack-protector-strong -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.34/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python3.10/config-3.10-x86_64-linux-gnu -lpython3.10 -lcrypt -ldl -lm -lm -L/usr/lib/x86_64-linux-gnu -ltcl8.6 -ldl -lz -lpthread -lm -lruby-3.0 -lm -L/usr/lib 

:messages

Messages maintainer: Bram Moolenaar <[email protected]>

:scriptnames
  1: ~/jedi.vimrc
  2: ~/.vim/autoload/plug.vim
  3: /usr/share/vim/vim82/filetype.vim
  4: /usr/share/vim/vim82/ftplugin.vim
  5: /usr/share/vim/vim82/indent.vim
  6: /usr/share/vim/vim82/syntax/syntax.vim
  7: /usr/share/vim/vim82/syntax/synload.vim
  8: /usr/share/vim/vim82/syntax/syncolor.vim
  9: /usr/share/vim/vim82/colors/lists/default.vim
 10: ~/.vim/plugged/jedi-vim/plugin/jedi.vim
 11: /usr/share/vim/vim82/plugin/getscriptPlugin.vim
 12: /usr/share/vim/vim82/plugin/gzip.vim
 13: /usr/share/vim/vim82/plugin/logiPat.vim
 14: /usr/share/vim/vim82/plugin/manpager.vim
 15: /usr/share/vim/vim82/plugin/matchparen.vim
 16: /usr/share/vim/vim82/plugin/netrwPlugin.vim
 17: /usr/share/vim/vim82/plugin/rrhelper.vim
 18: /usr/share/vim/vim82/plugin/spellfile.vim
 19: /usr/share/vim/vim82/plugin/tarPlugin.vim
 20: /usr/share/vim/vim82/plugin/tohtml.vim
 21: /usr/share/vim/vim82/plugin/vimballPlugin.vim
 22: /usr/share/vim/vim82/plugin/zipPlugin.vim
 23: ~/.vim/plugged/jedi-vim/ftplugin/python/jedi.vim
 24: ~/.vim/plugged/jedi-vim/autoload/jedi.vim
 25: /usr/share/vim/vim82/ftplugin/python.vim
 26: ~/.vim/plugged/jedi-vim/after/ftplugin/python/jedi.vim
 27: /usr/share/vim/vim82/indent/python.vim
 28: ~/.vim/syntax/python.vim
 29: /usr/share/vim/vim82/syntax/python.vim
 30: ~/.vim/plugged/jedi-vim/after/syntax/python.vim
@davidhalter
Copy link
Owner

Unfortunately this is kind of a known issue. Because there's no index, there's all sorts of "slow" things going on. See also davidhalter/jedi#1059.

I'm currently rewriting Jedi/Mypy in Rust to avoid this issue.

There might still be hope here. We could theoretically disable a certain kind of functionality in case of imported modules, that would make this issue quite a bit faster. I'm thinking about that.

@ilekka
Copy link
Author

ilekka commented Dec 29, 2023

Thanks for the insight, and for the plugin, which has served me well for several years.

I had already resigned to using ~/empty/directory/with/no/python/anywhere/in/sight as a workaround when working with python-igraph. However, I eventually found asyncomplete.vim, which seems to be a better solution. It does give very speedy completions when Jedi is used as the language server.

@davidhalter
Copy link
Owner

Yes, that makes complete sense. I definitely feel like there might be better solutions out there for Jedi completions than jedi-vim. The thing that many of these don't do is the other stuff like gotos.

There's also https://github.com/deoplete-plugins/deoplete-jedi/ if you are using neovim, I guess. AFAIK @blueyed has been using that.

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

No branches or pull requests

2 participants