@@ -1444,12 +1444,19 @@ def __init__(self, path, cursor, context, file, parent):
14441444 )
14451445
14461446 self ._keys = []
1447+ self ._keys_lookup = {}
14471448 for _ in range (num_keys ):
14481449 key = ReadOnlyKey (
14491450 keys_chunk , keys_cursor , {}, file , self , read_strings = True
14501451 )
1452+ name = key .fName
1453+ if name not in self ._keys_lookup :
1454+ self ._keys_lookup [name ] = []
1455+ self ._keys_lookup [name ].append (len (self ._keys ))
14511456 self ._keys .append (key )
14521457
1458+ self ._len = None
1459+
14531460 self .hook_after_keys (
14541461 chunk = chunk ,
14551462 cursor = cursor ,
@@ -1901,11 +1908,13 @@ def _ipython_key_completions_(self):
19011908 return self .iterkeys () # noqa: B301 (not a dict)
19021909
19031910 def __len__ (self ):
1904- return len (self ._keys ) + sum (
1905- len (x .get ())
1906- for x in self ._keys
1907- if x .fClassName in ("TDirectory" , "TDirectoryFile" )
1908- )
1911+ if self ._len is None :
1912+ self ._len = len (self ._keys ) + sum (
1913+ len (x .get ())
1914+ for x in self ._keys
1915+ if x .fClassName in ("TDirectory" , "TDirectoryFile" )
1916+ )
1917+ return self ._len
19091918
19101919 def __contains__ (self , where ):
19111920 try :
@@ -2031,14 +2040,14 @@ def key(self, where):
20312040 item , cycle = where , None
20322041
20332042 last = None
2034- for key in self ._keys :
2035- if key . fName == item :
2036- if cycle == key .fCycle :
2037- return key
2038- elif cycle is None and last is None :
2039- last = key
2040- elif cycle is None and last .fCycle < key .fCycle :
2041- last = key
2043+ for index in self ._keys_lookup . get ( item , []) :
2044+ key = self . _keys [ index ]
2045+ if cycle == key .fCycle :
2046+ return key
2047+ elif cycle is None and last is None :
2048+ last = key
2049+ elif cycle is None and last .fCycle < key .fCycle :
2050+ last = key
20422051
20432052 if last is not None :
20442053 return last
0 commit comments