davidhalter / jedi-vim

Using the jedi autocompletion library for VIM.
MIT License
5.27k stars 370 forks source link

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

Open ilekka opened 8 months ago

ilekka commented 8 months ago

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
Global Python

Using Python version 3 to access Jedi.

Jedi
Jedi environment: <Environment: 3.11.7 in /home/ilkka/mambaforge/envs/3.11>
Known environments
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 team+vim@tracker.debian.org
Compiled by team+vim@tracker.debian.org
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 <Bram@vim.org>
: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 commented 8 months ago

Unfortunately this is kind of a known issue. Because there's no index, there's all sorts of "slow" things going on. See also https://github.com/davidhalter/jedi/issues/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 commented 7 months ago

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 commented 7 months ago

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.