рдпрд╣
рдПрдХрддрд╛-рд▓рд╛рдВрдЪрд░-рд╕рдВрдкрд╛рджрдХ - рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдВрдкрд╛рджрдХ рдФрд░ рдЙрдмрдВрдЯреВ рдХреЗ рд▓рд┐рдП рдПрдХрддрд╛ рдкреИрдирд▓ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдиреВ (рдХреНрд╡рд┐рдХрд▓рд┐рд╕реНрдЯ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛ред рд╕рдВрдкрд╛рджрдХ рдХреЛ python + gtk рдмрдВрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдХрд░реНрддрд╡реНрдпреЛрдВ рдХреЛ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рд╕реЗ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИред рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕рдордп рдХреА рдШреЛрд╖рдгрд╛: рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ рд▓рдВрдмрд╛ рд╕рдордп рдЧреБрдЬрд░рддрд╛ рд╣реИред
рдЖрдк рдкрд╛рдпрдерди, рдпреВрдирд┐рдЯреА рдпрд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рджреЛрд╖ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реИ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реИред "рдЕрдзреНрдпрдпрди" рдХреЗ рджреМрд░рд╛рди рдЙрдиреНрд╣реЛрдВрдиреЗ рдиреЛрдЯреНрд╕ рдмрдирд╛рдП рдЬреЛ рдЗрд╕ рдиреЛрдЯ рдХрд╛ рдЖрдзрд╛рд░ рдмрдиреЗред рдореИрдВ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рд╕реЗ рдкреВрдЫрддрд╛ рд╣реВрдВред
рдЪрд░рдг 1
рд╣рдо рдПрдХ рдорд╛рдирдХ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рджреЗрдЦрддреЗ рд╣реИрдВ:
python -m cProfile -s cumulative ule
рдкрд░рд┐рдгрд╛рдо:
211267 function calls (203946 primitive calls) in 49.801 seconds Ordered by: cumulative time ncalls tottime percall cumtime percall filename:lineno(function) 1 0.002 0.002 49.801 49.801 ule:19(<module>) 1 0.000 0.000 49.415 49.415 ule:29(main) 4598/4584 0.007 0.000 49.224 0.011 types.py:46(function) 4599/4585 49.208 0.011 49.218 0.011 {method 'invoke' of 'gi.CallableInfo' objects} 1 0.001 0.001 46.013 46.013 app.py:47(__init__) 1 0.001 0.001 45.945 45.945 app.py:230(__populate) 24 0.007 0.000 45.936 1.914 app.py:211(new_from_file) 45 0.002 0.000 45.454 1.010 iconmanager.py:93(get_icon) 45 0.014 0.000 0.408 0.009 iconmanager.py:29(__init__) 1 0.000 0.000 0.343 0.343 iconmanager.py:71(get_icon_with_file) 1 0.000 0.000 0.343 0.343 iconmanager.py:60(get_icon_with_name) ................................................................................
рд╡рд╛рд╣! рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 50 рд╕реЗрдХрдВрдбред
рдЪрд░рдг 2
рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░,
app.py
рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЧрд▓рдд рдерд╛:
app.py:230(__populate)
- рдПрдХ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ 46 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВ
app.py:211(new_from_file)
- 24 рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░рддрд┐ рдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ 2 рд╕реЗрдХрдВрдб
iconmanager.py:93(get_icon)
- 45 рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓рдЧрднрдЧ 1 рд╕реЗрдХрдВрдб рдкреНрд░рддрд┐ рдХреЙрд▓
рдХреЛрдб рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рдХреВрдмрдбрд╝ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐
__populate
рдлрд╝рдВрдХреНрд╢рди
new_form_file
рдХреЙрд▓
new_form_file
, рдЬреЛ
get_icon
рдХреЙрд▓
get_icon
ред
рдЖрдЗрдП
__populate
рд╢реБрд░реВ рдХрд░реЗрдВ:
def __populate(self): self.launcher_view.clear_list(); self.unity = self.gsettings.get_value('favorites') log.info(self.unity) for menu_item in self.unity: self.new_from_file(menu_item, False) self.launcher_view.connect('selection-changed', self.__launcher_view_row_change)
рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдкреИрдирд▓ рдореЗрдВ 24 рддрддреНрд╡ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП
new_from_file(menu_item, False)
def new_from_file(self, filename, selected=True): try: file_path = normalize_path(filename, True) obj = DesktopParser(file_path) sname = obj.get('Name',locale=LOCALE) desc = obj.get('Comment',locale=LOCALE) icon = obj.get('Icon') pix = IconManager().get_icon(ThemedIcon('image-missing'),32) if icon: if icon.rfind('.') != -1: pix = IconManager().get_icon(FileIcon(File(icon)),32) else: pix = IconManager().get_icon(ThemedIcon(icon),32) data = (pix, '%s' % sname, obj, sname.upper(), file_path) return self.launcher_view.add_row(data,selected) except: return None
рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдЖрдкрдХреА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝рддреА рд╣реИ рд╡рд╣ рд╣реИ рд░реЗрдЦрд╛:
pix = IconManager().get_icon(ThemedIcon('image-missing'),32)
рдЫрд╡рд┐-рд▓рд╛рдкрддрд╛ рдЬреИрд╕рд╛ рдЖрдЗрдХрди рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЧреБрдг рдмрдирд╛рддреЗ рд╣реИрдВред
__populate
рд╡рд┐рдзрд┐ рдореЗрдВ,
__populate
рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ
__populate
рдЬреЛрдбрд╝реЗрдВ:
self.pix_missing = IconManager().get_icon(ThemedIcon('image-missing'), 32)
рдФрд░
pix = self.pix_missing
рд╕рд╛рде
new_from_file
рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд▓рд╛рдЗрди рдХреЛ
pix = self.pix_missing
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХрд╛ рд╕рдордп рдХреИрд╕реЗ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ:
python -m cProfile -s cumulative ule
рдкрд░рд┐рдгрд╛рдо 2:
194247 function calls (186926 primitive calls) in 8.863 seconds Ordered by: cumulative time ncalls tottime percall cumtime percall filename:lineno(function) 1 0.007 0.007 8.864 8.864 ule:19(<module>) 1 0.000 0.000 8.363 8.363 ule:29(main) 2988/2974 0.008 0.000 8.189 0.003 types.py:46(function) 2989/2975 8.176 0.003 8.182 0.003 {method 'invoke' of 'gi.CallableInfo' objects} 1 0.001 0.001 6.817 6.817 app.py:48(__init__) 1 0.000 0.000 6.704 6.704 app.py:244(__populate) 24 0.003 0.000 6.697 0.279 app.py:224(new_from_file) 22 0.001 0.000 6.489 0.295 iconmanager.py:93(get_icon) 1 0.004 0.004 0.248 0.248 app.py:18(<module>)
рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдбрдмрд▓-рдЪреЗрдХ (рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛): рд╕реНрдерд┐рд░ рд╢реВрдиреНрдп рд╕реЗ 35-40 рд╕реЗрдХрдВрдбред
9 рд╕реЗрдХрдВрдб рдмрд╣реБрдд рдХрдо рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИред
рдЖрдЗрдП рдЗрд╕реЗ рд╕реБрдзрд╛рд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред
рдЪрд░рдг 3
рд╣рд░ рдмрд╛рд░
IconManager рдХреЛ рдПрдХ рдЕрд▓рдЧ рдСрдмреНрдЬреЗрдХреНрдЯ (рдФрд░ рд╣рдореЗрд╢рд╛ рддрд░реНрдХреЛрдВ рдХреЗ рдмрд┐рдирд╛) рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЧреБрдг рдмрдирд╛рддреЗ рд╣реИрдВред
__init__
рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
self.icon_manager = IconManager()
IconManager()
рдХреА рд╕рднреА рдШрдЯрдирд╛рдПрдВ
IconManager()
self.icon_manager
рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВред
рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
python -m cProfile -s cumulative ule
Rezultat3:
178980 function calls (171659 primitive calls) in 1.949 seconds Ordered by: cumulative time ncalls tottime percall cumtime percall filename:lineno(function) 1 0.001 0.001 1.949 1.949 ule:19(<module>) 1 0.000 0.000 1.449 1.449 ule:29(main) 1560/1546 0.004 0.000 1.314 0.001 types.py:46(function) 1561/1547 1.304 0.001 1.310 0.001 {method 'invoke' of 'gi.CallableInfo' objects} 1 0.001 0.001 0.285 0.285 app.py:48(__init__) 1 0.004 0.004 0.252 0.252 app.py:18(<module>) 206/45 0.005 0.000 0.191 0.004 {__import__} 9/5 0.000 0.000 0.187 0.037 importer.py:56(load_module) 9/5 0.000 0.000 0.186 0.037 module.py:239(_load) 1 0.002 0.002 0.174 0.174 pkg_resources.py:14(<module>) 1 0.000 0.000 0.159 0.159 app.py:245(__populate) 2617/377 0.011 0.000 0.159 0.000 {map} 24 0.003 0.000 0.153 0.006 app.py:225(new_from_file) 1 0.004 0.004 0.146 0.146 Gtk.py:22(<module>) 159/132 0.012 0.000 0.132 0.001 module.py:111(__getattr__) 1 0.000 0.000 0.107 0.107 pkg_resources.py:698(subscribe) 102 0.000 0.000 0.107 0.001 pkg_resources.py:2835(<lambda>) 102 0.001 0.000 0.106 0.001 pkg_resources.py:2256(activate) 22 0.001 0.000 0.098 0.004 iconmanager.py:93(get_icon)
рдЦрд┐рдбрд╝рдХреА рд▓рдЧрднрдЧ рддреБрд░рдиреНрдд рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред рдХреБрд▓ рд╕рдордп рд▓рдЧрднрдЧ рджреЛ рд╕реЗрдХрдВрдб рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде рд╡рд┐рдВрдбреЛ рдмрдВрдж рдХрд░рдирд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдкрдВрдХреНрддрд┐
1 0.001 0.001 0.285 0.285 app.py:48(__init__)
рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ: рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдордп рдкрд┐рдЫрд▓реЗ рдорд╛рдк рдореЗрдВ 6.8 рд╕реЗрдХрдВрдб рд╕реЗ рдмрджрд▓рдХрд░ рдЖрдЦрд┐рд░реА рдореЗрдВ 0.3 рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдЖрдк рд╡рд╣реАрдВ рд░реБрдХ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд░рд┐рдгрд╛рдо
рдЫреЛрдЯреЗ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рдХрд╛рд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рд╕рдордп 46 рд╕реЗрдХрдВрдб рд╕реЗ
app.py:48(__init__)
0.3 (
app.py:48(__init__)
рд▓рд┐рдП) рд╣реЛ рдЧрдпрд╛ред
рдбреЗрд╡рд▓рдкрд░реНрд╕
рдХреЛ рднреЗрдЬреЗ рдЧрдП рдмрджрд▓рд╛рд╡
рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рдЕрдкрдирд╛ рдХрд╛рдлреА рд╕рдордп рдЦрд░реНрдЪ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕реБрдзрд╛рд░ рд╕рдХрддрд╛ рд╣реИред
рдореБрд╢реНрдХрд┐рд▓ рдлрд╝рд╛рдЗрд▓ рдкрд░рд┐рд╡рд░реНрддрди рдпреБрдкреАрдбреА:
рдФрд░ рдореИрдВрдиреЗ рд╣рд╛рдереА рдХреЛ рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛
рджреЛ рдкреНрд░рд╢реНрди рдЕрд╕реНрдкрд╖реНрдЯ рд░рд╣реЗ:
- рджреЛ рджрд░реНрдЬрди рдореЗрдиреВ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд▓рдВрдмрд╛ (50 рд╕реЗрдХрдВрдб) рд▓реЙрдиреНрдЪ;
- рдкрд╣рд▓реЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рдж рд▓реЛрдб рд╕рдордп (5 рдЧреБрдирд╛) рдореЗрдВ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдХрдореАред
рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдЕрдкрд░рд╛рдзреА
self.icontheme = Gtk.IconTheme.get_default()
рдСрдмреНрдЬреЗрдХреНрдЯ рдерд╛ред
IconManager рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рдЙрди рд░рд╛рд╕реНрддреЛрдВ рдХреА рд╕реВрдЪреА, рдЬрд┐рдирдореЗрдВ рдЖрдЗрдХрди рдЦреЛрдЬрд╛ рдЧрдпрд╛ рд╣реИ, рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ Gtk.IconTheme.get_default () рд╕рд┐рдВрдЧреНрд▓рдЯрди рдирд╣реАрдВ рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ,
IconManager рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╕реЗ рд╕реВрдЪреА рдореЗрдВ 67 рддрддреНрд╡ рдмрдврд╝ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рд▓рдЧрднрдЧ 300 рдЧреБрдирд╛ (10 рд╕реЗ 2985 рддрдХ) рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИред
IconManager рд╡рд░реНрдЧ рдирд┐рд░реНрдорд╛рддрд╛ def __init__(self): self.icontheme = Gtk.IconTheme.get_default()
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрджрд▓рдХрд░, рдЖрдк рдкреНрд░рд╛рд░рдВрдн рд╕рдордп рдХреЛ 0.8 рд╕реЗрдХрдВрдб (рдкрд┐рдЫрд▓реЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд┐рдирд╛) рдФрд░ 0.6 (рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде) рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд┐рдЫрд▓реЗ рдкрд░рд┐рд╡рд░реНрддрди "рдХреЙрд╕реНрдореЗрдЯрд┐рдХ" рдмрди рдЧрдП рд╣реИрдВред
рдореБрд╢реНрдХрд┐рд▓ рдлрд╝рд╛рдЗрд▓ рдкрд░рд┐рд╡рд░реНрддрди рдмрдЧ
рдмрдирд╛рдпрд╛ , рдкреИрдЪ
рднреЗрдЬрд╛ ред