ArneBachmann / tagsplorer

A quick and resource-efficient OS-independent tagging filetree extension tool and library
Mozilla Public License 2.0
3 stars 1 forks source link

Improve search performance for larger databases #94

Closed ArneBachmann closed 3 years ago

ArneBachmann commented 3 years ago

Building all paths is slow. Do some performance analysis and try to improve essential code parts.

ArneBachmann commented 3 years ago

By calls:

706326    0.133    0.000    0.133    0.000 {method 'join' of 'str' objects}
   706052    0.165    0.000    4.045    0.000 utils.py:86(<lambda>)
   629763    0.160    0.000    0.160    0.000 utils.py:204(dictGet)
   591635    0.143    0.000    0.289    0.000 utils.py:218(dictGetSet)
   553547    0.323    0.000    0.323    0.000 {method 'split' of 'str' objects}
   553520    0.524    0.000    1.239    0.000 utils.py:304(<lambda>)
   498659    0.056    0.000    0.056    0.000 {built-in method builtins.isinstance}
153125/152542    0.122    0.000    4.191    0.000 utils.py:90(wrapExc)
   152643    0.012    0.000    0.012    0.000 {built-in method builtins.callable}
   152524    0.051    0.000    0.210    0.000 re.py:313(filter)
   152524    0.119    0.000    0.159    0.000 sre_parse.py:1036(expand_template)
   152524    0.022    0.000    0.022    0.000 {method 'group' of 're.Match' objects}
   152516    0.085    0.000    0.118    0.000 re.py:271(_compile)
   152515    0.065    0.000    0.065    0.000 re.py:307(_subx)
   152515    0.064    0.000    1.646    0.000 re.py:180(search)
   152515    0.043    0.000    0.579    0.000 utils.py:250(escapeRegex)
   152515    0.061    0.000    2.642    0.000 utils.py:270(<lambda>)
   152515    1.464    0.000    1.464    0.000 {method 'search' of 're.Pattern' objects}
   152515    0.261    0.000    0.536    0.000 {method 'sub' of 're.Pattern' objects}
   114472    0.126    0.000    4.248    0.000 {built-in method _functools.reduce}
   114414    0.064    0.000    4.240    0.000 utils.py:86(xany)
78073/78031    0.004    0.000    0.004    0.000 {built-in method builtins.len}
    76886    0.006    0.000    0.006    0.000 {method 'get' of 'dict' objects}
76272/38157    0.061    0.000    0.084    0.000 lib.py:371(getPath)
    42319    0.027    0.000    0.027    0.000 {method 'update' of 'set' objects}
    42108    0.049    0.000    0.076    0.000 lib.py:449(<lambda>)
    38159    0.008    0.000    0.092    0.000 lib.py:415(<genexpr>)
    38133    0.027    0.000    2.778    0.000 utils.py:258(pathHasGlobalSkip)
    38133    0.048    0.000    0.096    0.000 utils.py:273(pathHasGlobalIgnore)
    38133    0.010    0.000    0.010    0.000 {method 'rindex' of 'str' objects}
    38124    0.067    0.000    1.553    0.000 utils.py:295(anyParentIsSkipped)
    38124    0.019    0.000    0.019    0.000 {method 'count' of 'str' objects}
     2611    0.000    0.000    0.000    0.000 {method 'lower' of 'str' objects}
     1535    0.000    0.000    0.000    0.000 {method 'append' of 'list' objects}
     1414    0.000    0.000    0.000    0.000 {built-in method nt.fspath}
     1145    0.000    0.000    0.000    0.000 {method 'replace' of 'str' objects}
      986    0.001    0.000    0.002    0.000 ntpath.py:44(normcase)
      590    0.156    0.000    0.156    0.000 {built-in method nt.stat}
      583    0.001    0.000    0.156    0.000 genericpath.py:27(isfile)
      583    0.001    0.000    0.157    0.000 utils.py:172(<lambda>)
      583    0.001    0.000    0.158    0.000 utils.py:172(isFile)
      583    0.000    0.000    0.000    0.000 {built-in method _stat.S_ISREG}
      527    0.000    0.000    0.000    0.000 sre_parse.py:164(__getitem__)
      452    0.000    0.000    0.000    0.000 {built-in method builtins.hasattr}
      425    0.000    0.000    0.002    0.000 fnmatch.py:19(fnmatch)
      425    0.000    0.000    0.001    0.000 fnmatch.py:64(fnmatchcase)
      425    0.000    0.000    0.000    0.000 {method 'match' of 're.Pattern' objects}
      408    0.000    0.000    0.000    0.000 {method 'rfind' of 'str' objects}
      283    0.001    0.000    0.001    0.000 sre_parse.py:233(__next)
      281    0.000    0.000    0.000    0.000 {method 'acquire' of '_thread.RLock' objects}

By cumulative time:

     1    0.002    0.002    6.482    6.482 tp.py:145(find)
        1    0.000    0.000    4.628    4.628 lib.py:438(findFolders)
        1    0.065    0.065    4.431    4.431 lib.py:451(<listcomp>)
   114472    0.125    0.000    4.187    0.000 {built-in method _functools.reduce}
   114414    0.065    0.000    4.172    0.000 utils.py:86(xany)
153125/152542    0.124    0.000    4.167    0.000 utils.py:90(wrapExc)
   706052    0.166    0.000    3.979    0.000 utils.py:86(<lambda>)
    38133    0.026    0.000    2.741    0.000 utils.py:258(pathHasGlobalSkip)
   152515    0.062    0.000    2.606    0.000 utils.py:270(<lambda>)
       25    0.000    0.000    1.622    0.065 tp.py:187(<genexpr>)
       24    0.002    0.000    1.621    0.068 lib.py:486(findFiles)
   152515    0.065    0.000    1.620    0.000 re.py:180(search)
    38124    0.063    0.000    1.517    0.000 utils.py:295(anyParentIsSkipped)
   152515    1.440    0.000    1.440    0.000 {method 'search' of 're.Pattern' objects}
       24    0.000    0.000    1.408    0.059 lib.py:515(<lambda>)
       24    1.241    0.052    1.241    0.052 {built-in method nt.listdir}
   553520    0.510    0.000    1.207    0.000 utils.py:304(<lambda>)
   152515    0.042    0.000    0.567    0.000 utils.py:250(escapeRegex)
   152515    0.257    0.000    0.525    0.000 {method 'sub' of 're.Pattern' objects}
   553547    0.316    0.000    0.316    0.000 {method 'split' of 'str' objects}
   591635    0.139    0.000    0.281    0.000 utils.py:218(dictGetSet)
      136    0.000    0.000    0.218    0.002 __init__.py:1491(_log)
      136    0.000    0.000    0.210    0.002 __init__.py:1516(handle)
      127    0.001    0.000    0.210    0.002 lib.py:13(<lambda>)
      136    0.001    0.000    0.210    0.002 __init__.py:1570(callHandlers)
      136    0.000    0.000    0.210    0.002 __init__.py:881(handle)
      136    0.001    0.000    0.209    0.002 __init__.py:1013(emit)
      136    0.204    0.001    0.204    0.001 {method 'write' of '_io.TextIOWrapper' objects}
   152524    0.049    0.000    0.200    0.000 re.py:313(filter)
        1    0.013    0.013    0.194    0.194 lib.py:447(rebuild)
       24    0.002    0.000    0.167    0.007 lib.py:515(<listcomp>)
      583    0.001    0.000    0.165    0.000 utils.py:172(isFile)
      583    0.001    0.000    0.164    0.000 utils.py:172(<lambda>)
      583    0.001    0.000    0.163    0.000 genericpath.py:27(isfile)
      590    0.163    0.000    0.163    0.000 {built-in method nt.stat}
   629763    0.157    0.000    0.157    0.000 utils.py:204(dictGet)
        1    0.000    0.000    0.152    0.152 lib.py:188(load)
   152524    0.112    0.000    0.151    0.000 sre_parse.py:1036(expand_template)
       83    0.000    0.000    0.143    0.002 __init__.py:1356(debug)
   706326    0.129    0.000    0.129    0.000 {method 'join' of 'str' objects}
        1    0.129    0.129    0.129    0.129 {built-in method _pickle.loads}
   152516    0.083    0.000    0.115    0.000 re.py:271(_compile)
    38133    0.047    0.000    0.094    0.000 utils.py:273(pathHasGlobalIgnore)
    38159    0.009    0.000    0.093    0.000 lib.py:415(<genexpr>)
76272/38157    0.061    0.000    0.084    0.000 lib.py:371(getPath)
    42108    0.055    0.000    0.082    0.000 lib.py:449(<lambda>)
       53    0.000    0.000    0.075    0.001 __init__.py:1368(info)
       24    0.071    0.003    0.071    0.003 {built-in method builtins.print}
   152515    0.068    0.000    0.068    0.000 re.py:307(_subx)
   498659    0.055    0.000    0.055    0.000 {built-in method builtins.isinstance}

By total time:

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   152515    1.469    0.000    1.469    0.000 {method 'search' of 're.Pattern' objects}
       24    1.233    0.051    1.233    0.051 {built-in method nt.listdir}
   553520    0.517    0.000    1.235    0.000 utils.py:304(<lambda>)
   553547    0.340    0.000    0.340    0.000 {method 'split' of 'str' objects}
   152515    0.265    0.000    0.531    0.000 {method 'sub' of 're.Pattern' objects}
      136    0.216    0.002    0.216    0.002 {method 'write' of '_io.TextIOWrapper' objects}
   706052    0.167    0.000    4.034    0.000 utils.py:86(<lambda>)
      590    0.159    0.000    0.159    0.000 {built-in method nt.stat}
   629763    0.155    0.000    0.155    0.000 utils.py:204(dictGet)
   591635    0.142    0.000    0.282    0.000 utils.py:218(dictGetSet)
        1    0.131    0.131    0.131    0.131 {built-in method _pickle.loads}
   706326    0.126    0.000    0.127    0.000 {method 'join' of 'str' objects}
   114472    0.126    0.000    4.239    0.000 {built-in method _functools.reduce}
153125/152542    0.124    0.000    4.178    0.000 utils.py:90(wrapExc)
   152524    0.114    0.000    0.154    0.000 sre_parse.py:1036(expand_template)
   152516    0.082    0.000    0.114    0.000 re.py:271(_compile)
       24    0.077    0.003    0.077    0.003 {built-in method builtins.print}
   152515    0.066    0.000    1.650    0.000 re.py:180(search)
        1    0.064    0.064    4.484    4.484 lib.py:451(<listcomp>)
    38124    0.063    0.000    1.548    0.000 utils.py:295(anyParentIsSkipped)
   114414    0.061    0.000    4.224    0.000 utils.py:86(xany)
   152515    0.060    0.000    0.060    0.000 re.py:307(_subx)
76272/38157    0.058    0.000    0.081    0.000 lib.py:371(getPath)
   152515    0.055    0.000    2.631    0.000 utils.py:270(<lambda>)
   498659    0.055    0.000    0.055    0.000 {built-in method builtins.isinstance}
    42108    0.052    0.000    0.079    0.000 lib.py:449(<lambda>)
   152524    0.051    0.000    0.206    0.000 re.py:313(filter)
    38133    0.046    0.000    0.092    0.000 utils.py:273(pathHasGlobalIgnore)
   152515    0.042    0.000    0.573    0.000 utils.py:250(escapeRegex)
    42319    0.027    0.000    0.027    0.000 {method 'update' of 'set' objects}
    38133    0.026    0.000    2.765    0.000 utils.py:258(pathHasGlobalSkip)
   152524    0.023    0.000    0.023    0.000 {method 'group' of 're.Match' objects}
    38124    0.019    0.000    0.019    0.000 {method 'count' of 'str' objects}
        1    0.017    0.017    0.017    0.017 {built-in method zlib.decompress}
   152643    0.012    0.000    0.012    0.000 {built-in method builtins.callable}
        1    0.011    0.011    0.185    0.185 lib.py:447(rebuild)
    38133    0.010    0.000    0.010    0.000 {method 'rindex' of 'str' objects}
    38159    0.009    0.000    0.089    0.000 lib.py:415(<genexpr>)
    76886    0.006    0.000    0.006    0.000 {method 'get' of 'dict' objects}
78073/78031    0.004    0.000    0.004    0.000 {built-in method builtins.len}
       24    0.002    0.000    1.617    0.067 lib.py:486(findFiles)
      136    0.002    0.000    0.005    0.000 __init__.py:282(__init__)
        1    0.002    0.002    6.532    6.532 tp.py:145(find)
       24    0.002    0.000    0.164    0.007 lib.py:515(<listcomp>)
      283    0.002    0.000    0.002    0.000 sre_parse.py:233(__next)
      583    0.001    0.000    0.160    0.000 genericpath.py:27(isfile)
      136    0.001    0.000    0.001    0.000 {built-in method time.localtime}
      986    0.001    0.000    0.002    0.000 ntpath.py:44(normcase)
      583    0.001    0.000    0.161    0.000 utils.py:172(<lambda>)
      137    0.001    0.000    0.001    0.000 {built-in method time.strftime}