First install the latest fuzzy finder script. Then...
Config
Tweak some config in your .vimrc:
" Truth be told, I don't remember what these do, but I must have
" found them necessary back when I installed fuzzyfinder years ago
let s:slash = '[/\\]'
let s:startname = '(^|'.s:slash.')'
let s:endname = '($|'.s:slash.')'
" directories and extensions to ignore when listing files
" these contain a lot of Python-isms, yours will probably vary
let s:extension = '\.bak|\.dll|\.exe|\.o|\.pyc|\.pyo|\.swp|\.swo'
let s:dirname = 'build|deploy|dist|vms|\.bzr|\.git|\.hg|\.svn|.+\.egg-info'
let g:fuf_file_exclude = '\v'.'('.s:startname.'('.s:dirname.')'.s:endname.')|(('.s:extension.')$)'
let g:fuf_dir_exclude = '\v'.s:startname.'('.s:dirname.')'.s:endname
" limit number of displayed matches
" (makes response instant even on huge source trees)
let g:fuf_enumeratingLimit = 60
and I define some shortcut keys to activate it:
nnoremap <Leader>f :FufFile **/<cr>
nnoremap <Leader>b :FufBuffer<cr>
nnoremap <Leader>t :FufTag<cr>
and restart Vim to re-read the .vimrc config.
Find file / buffer
Now I can press <leader>f to see a list of files in the current directory and subdirs. Start typing and the list is filtered to just those that (fuzzy)match what you type. Use cursor keys to select a match and enter to open that file. The first time you activate this in a very large new project, it might take a second to cache the filenames.
Similarly, when you have a few buffers open, press <leader>b to select from a list of open buffers.
Find tag
Best of all is tag matching (i.e. go to a function, class, method, etc.) First we have to generate a tagfile though.
If you're not used to tags files, this might seem like a hassle to have to do it manually. Be aware that many tools use tags files, for example Vim itself will read them to enable 'go to definition', see that link at the end of this answer, so learning about them is perhaps more valuable than you might expect.
Install the latest ctags (http://ctags.sourceforge.net/) and make sure it's on your PATH so you can invoke it from the command line. Recent versions are much improved for languages like Python. Then define a keystroke in .vimrc to make it easy to re-run it on your project, and blow away fuzzyfinder's cache at the same time:
noremap <f12> :silent !ctags -R --languages=python .<cr>:FufRenewCache<cr>
or on Windows:
noremap <f12> :!start /min ctags -R --languages=python .<cr>:FufRenewCache<cr>
(the /min is a Windows-specific way to run the command in the background so that Vim doesn't lock up while indexing very large projects)
Restart vim, and pressing f12 will now scan every file in the current dir and subdirs, and create an index of all defined functions, classes, etc. ctags parses many programming languages. The output goes to a file called 'tags'. It makes sense to run this in your project root (use Vim's :pwd and :cd to make sure that's where you are) so that the tags file contains everything in your project.
So now you can press <leader>t to see a listing of all the classes, functions, methods, etc in yourproject. As above, start typing, and the list gets filtered down to just those that match what you type. Use cursors and enter to select one, and Vim will go to the file/line where that tag is defined.
Gotchas
If a tag is defined more than once in your project, (e.g. a class with the same name as a function) then fuzzyfinder will offer a menu so you can choose which one you want to jump to. This can be a bit annoying, because by default, ctags produces too many tag definitions for Python files. It lists not just the definition of classes, methods and function, but all the places any symbol is defined within a source file. This includes the creation of variables, and the places where a symbol is imported from somewhere else. This means that a symbol which is defined in one file and imported in a second file will have two definition locations, which means you'll always be presented with a menu instead of simply jumping directly to the class definition. You can fix this by creating a ctags options file in ~/.ctags, telling it not to generate tags for 'include' statments, and to skip some directories:
--python-kinds=-i
--exclude=build
--exclude=dist
When you change your source code, your tags file will be out of date. If you create new classes/functions/methods/etc then to jump to them you'll have to re-run ctags as shown above. It's surprising how infrequently this matters though.
I found that <leader>b would pause for a second before working, which was annoying. Turned out the reason is that there's another mapping defined for <leader>bd defined by my BClose plugin, and Vim was waiting to see whether or not I pressed the subsequent d before deciding which key mapping to invoke. I never use that, so I disabled it using this in my .vimrc:
autocmd VimEnter * nunmap <Leader>bd
BTW, now that you're generating tagfiles for your project, it's easy to also enable a keystroke to do 'go to definition' of the symbol under your text cursor. See my blog post about it: https://www.tartley.com/go-to-definition-in-vim-for-python-using-ctags-on-windows