davidhalter / jedi-vim

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

Jedi-vim startuptime with neovim #696

Closed DerWeh closed 3 years ago

DerWeh commented 7 years ago

Issue

I use neovim with jedi-vim. jedi-vim however has a massive effect on my startup time. My minimal vimrc is the following:

syntax on
filetype plugin indent on

call plug#begin('~/.config/nvim/plugged')
Plug 'davidhalter/jedi-vim', {'for': 'python'}
call plug#end()

I profiled the startuptime time.txt as you can see jedi-vim has an enormous impact of 1.6s. Is there anything I can do to accelerate this unbearable delay? Or is it at least possible to lazily load it? I am only using it's refactor utilities and the awesome call signature preview. Can I maybe speed it up by disabling some functionality.

blueyed commented 7 years ago

I think it is related to Neovim's Python setup. Try setting g:python3_host_prog explicitly, e.g. to some virtualenv for it (but be aware that Jedi does not use Python 3.6 when the virtualenv is 3.5 etc). Are you using Neovim master? Are you using Python 2/3?

blueyed commented 7 years ago

You could try profiling it really, see https://github.com/blueyed/dotfiles/blob/b0eb67e02475947e2f6180551f50dc4b5cc22f8b/vimrc#L7-L23 for something to use as a base.

blueyed commented 7 years ago

Your timings (for reference):

118.031  000.029  000.029: sourcing /usr/share/nvim/runtime/ftplugin.vim
118.337  001.330  001.270: sourcing /home/USERNAME/.config/nvim/plugged/jedi-vim/plugin/jedi.vim
119.008  000.076  000.076: sourcing /home/USERNAME/.config/nvim/syntax/python.vim
539.125  000.379  000.379: sourcing /usr/share/nvim/runtime/autoload/provider/pythonx.vim
965.414  427.578  427.199: sourcing /usr/share/nvim/runtime/autoload/provider/python3.vim
1687.160  1567.476  1139.898: sourcing /home/USERNAME/.config/nvim/plugged/jedi-vim/autoload/jedi.vim
1687.652  1568.214  000.738: sourcing /home/USERNAME/.config/nvim/plugged/jedi-vim/after/syntax/python.vim
1689.339  000.521  000.521: sourcing /home/USERNAME/.config/nvim/plugged/jedi-vim/ftplugin/python/jedi.vim
1690.131  000.034  000.034: sourcing /usr/share/nvim/runtime/ftplugin/python.vim
1691.673  000.183  000.183: sourcing /home/USERNAME/.config/nvim/plugged/jedi-vim/after/ftplugin/python/jedi.vim
1692.341  000.087  000.087: sourcing /usr/share/nvim/runtime/indent/python.vim
1694.172  021.958: opening buffers

My timings when loading jedi-vim non-lazily, and opening a Python file directly, using vim --cmd 'let g:profile = "/tmp/vim-profile.txt"' --startuptime /tmp/vim-startuptime.txt t.py:

178.913  001.156: clearing screen
191.032  000.110  000.110: sourcing /home/user/.vim/ftplugin/python.vim
575.003  383.248  383.248: sourcing /home/user/.vim/plugged/jedi-vim/autoload/jedi.vim
575.502  383.935  000.687: sourcing /home/user/.vim/plugged/jedi-vim/ftplugin/python/jedi.vim
577.055  000.506  000.506: sourcing /usr/share/vim/vim80/ftplugin/python.vim
577.359  000.058  000.058: sourcing /home/user/.vim/plugged/jedi-vim/after/ftplugin/python/jedi.vim
582.932  005.485  005.485: sourcing /home/user/.vim/plugged/vim-textobj-python/after/ftplugin/python/textobj-python.vim
583.074  000.057  000.057: sourcing /home/user/.vim/after/ftplugin/python.vim
583.580  000.305  000.305: sourcing /home/user/.vim/plugged/vim-python-pep8-indent/indent/python.vim
583.835  000.020  000.020: sourcing /usr/share/vim/vim80/indent/python.vim
583.974  000.016  000.016: sourcing /home/user/.vim/ftplugin/python.vim
584.594  000.390  000.390: sourcing /home/user/.vim/plugged/jedi-vim/ftplugin/python/jedi.vim
585.959  000.397  000.397: sourcing /usr/share/vim/vim80/ftplugin/python.vim
586.220  000.044  000.044: sourcing /home/user/.vim/plugged/jedi-vim/after/ftplugin/python/jedi.vim
591.770  005.470  005.470: sourcing /home/user/.vim/plugged/vim-textobj-python/after/ftplugin/python/textobj-python.vim
591.933  000.060  000.060: sourcing /home/user/.vim/after/ftplugin/python.vim
592.436  000.340  000.340: sourcing /home/user/.vim/plugged/vim-python-pep8-indent/indent/python.vim
592.697  000.010  000.010: sourcing /usr/share/vim/vim80/indent/python.vim
594.200  000.714  000.714: sourcing /usr/share/vim/vim80/syntax/python.vim
594.461  000.167  000.167: sourcing /home/user/.vim/plugged/jedi-vim/after/syntax/python.vim
602.943  000.091  000.091: sourcing /home/user/.vim/plugged/vim-stay/autoload/stay.vim
604.989  000.297  000.297: sourcing /home/user/.dotfiles/.lvimrc
606.339  028.954: opening buffers

The slowest part from vim-profile.txt:

FUNCTION  jedi#setup_py_version()
Called 1 time
Total time:   0.209877
 Self time:   0.209877
    1              0.209811         execute cmd_init.' '.s:script_path.'/initialize.py'

And there it's the import of jedi_vim.py that seems to be rather slow.

That's with Vim.

Using Neovim shows this:

FUNCTIONS SORTED ON TOTAL TIME
count  total (s)   self (s)  function
    2   0.382914   0.003407  <SNR>14_LoadFTPlugin()
    1   0.382219   0.000160  <SNR>2_lod_ft()
    5   0.376176   0.000179  <SNR>2_doautocmd()
    6   0.365915   0.000142  jedi#init_python()
    1   0.365774   0.185160  <SNR>116_init_python()
    1   0.180614   0.000017  jedi#force_py_version()
    1   0.180597             jedi#setup_py_version()
    1   0.180501   0.097276  provider#python3#Call()
    1   0.083225   0.000066  remote#host#Require()
    1   0.083159   0.083146  provider#pythonx#Require()

FUNCTIONS SORTED ON SELF TIME
count  total (s)   self (s)  function
    1   0.365774   0.185160  <SNR>116_init_python()
    1              0.180597  jedi#setup_py_version()
    1   0.180501   0.097276  provider#python3#Call()
    1   0.083159   0.083146  provider#pythonx#Require()
174.055  000.466: clearing screen
187.741  000.114  000.114: sourcing /home/user/.config/nvim/ftplugin/python.vim
555.183  366.876  366.876: sourcing /home/user/.vim/plugged/jedi-vim/autoload/jedi.vim
555.482  367.328  000.453: sourcing /home/user/.vim/plugged/jedi-vim/ftplugin/python/jedi.vim
556.538  000.237  000.237: sourcing /usr/share/nvim/runtime/ftplugin/python.vim
556.890  000.078  000.078: sourcing /home/user/.vim/plugged/jedi-vim/after/ftplugin/python/jedi.vim
562.535  005.559  005.559: sourcing /home/user/.vim/plugged/vim-textobj-python/after/ftplugin/python/textobj-python.vim
562.661  000.048  000.048: sourcing /home/user/.config/nvim/after/ftplugin/python.vim
563.135  000.284  000.284: sourcing /home/user/.vim/plugged/vim-python-pep8-indent/indent/python.vim
563.357  000.017  000.017: sourcing /usr/share/nvim/runtime/indent/python.vim
563.494  000.009  000.009: sourcing /home/user/.config/nvim/ftplugin/python.vim
564.012  000.255  000.255: sourcing /home/user/.vim/plugged/jedi-vim/ftplugin/python/jedi.vim
564.971  000.186  000.186: sourcing /usr/share/nvim/runtime/ftplugin/python.vim
565.258  000.042  000.042: sourcing /home/user/.vim/plugged/jedi-vim/after/ftplugin/python/jedi.vim
570.895  005.562  005.562: sourcing /home/user/.vim/plugged/vim-textobj-python/after/ftplugin/python/textobj-python.vim
571.009  000.038  000.038: sourcing /home/user/.config/nvim/after/ftplugin/python.vim
571.430  000.278  000.278: sourcing /home/user/.vim/plugged/vim-python-pep8-indent/indent/python.vim
571.665  000.010  000.010: sourcing /usr/share/nvim/runtime/indent/python.vim
572.954  000.646  000.646: sourcing /usr/share/nvim/runtime/syntax/python.vim
573.147  000.127  000.127: sourcing /home/user/.vim/plugged/jedi-vim/after/syntax/python.vim
580.903  000.070  000.070: sourcing /home/user/.vim/plugged/vim-stay/autoload/stay.vim
582.910  000.099  000.099: sourcing /home/user/.dotfiles/.lvimrc
605.780  050.738: opening buffers

Slow things there:

FUNCTION  <SNR>116_init_python()
Called 1 time
Total time:   0.365774
 Self time:   0.185160
    1              0.185046         let s:def_py = system('python -c '.shellescape('import sys; sys.stdout.write(str(sys.version_info[0]))'))
    …
                                    " Make sure that the auto-detected version is available in Vim.
    1              0.000017         if !has('nvim') || has('python'.(s:def_py == 2 ? '' : s:def_py))
    1   0.180630   0.000016             return jedi#force_py_version(s:def_py)
                                    endif

You could set g:jedi#force_py_version to e.g. 3 to skip the system call. Actually I think it might be a good thing to default to 3 here - I will look into creating a PR for that.

The other thing is initializing jedi-vim's Python module itself, which could be improved in some way, too - but needs more investigation.

FWIW, my jedi-vim config looks like this:

    Plug 'davidhalter/jedi-vim', {'on': ['Pyimport', 'JediDebugInfo']}

    function! s:my_plug_insertenter_python()
      if &ft ==# 'python'
        let plugs = ['jedi-vim']
        if s:use_deoplete
          let plugs += ['deoplete-jedi']
        endif
        call call('plug#load', plugs)
        autocmd! vimplug_load_on_insertmode_python
        if index(plugs, 'jedi-vim') != -1
          try
            call jedi#configure_call_signatures(1, 'i')
          catch
            call jedi#configure_call_signatures()
          endtry
        endif
      endif
    endfunction
    augroup vimplug_load_on_insertmode_python
      autocmd!
      autocmd InsertEnter * call s:my_plug_insertenter_python()
    augroup END

And the following to setup deoplete and others for insert mode in general:

    function! s:my_plug_insertenter()
      let plugs = ['cursorcross.vim', 'delimitMate']
      if s:use_deoplete
        let plugs += ['deoplete.nvim']
      endif
      call call('plug#load', plugs)
      autocmd! vimplug_load_on_insertmode
    endfunction
    augroup vimplug_load_on_insertmode
      autocmd!
      autocmd InsertEnter * call s:my_plug_insertenter()
      autocmd User deoplete.nvim call deoplete#enable()
    augroup END
blueyed commented 7 years ago

@DerWeh For reference, some helper scripts for profiling: https://github.com/blueyed/dotfiles/commit/51a32f385a821412eebf2170dbc5019860abe711

davidhalter commented 3 years ago

There wasn't ever an answer. I'm therefore closing.