Comipoli を PyGObject から Gjs に変更すると以前書いた。
実際に作っているんだけど困った、遅すぎる…
もしかして Gjs って遅いの?
いや単に zipfile モジュールが早いだけかも、実験だ。
zipfile を使うから当然 Python で。
blog で Python を書くのは久々のような。
#!/usr/bin/env python3 import time, zipfile, gi gi.require_version('GdkPixbuf', '2.0') from gi.repository import Gio, GLib, GdkPixbuf namelist = [] zipfile_list = [] unzip_list = [] sp = Gio.Subprocess.new(["unzip", "-Z", "test.cbz"], Gio.SubprocessFlags.STDOUT_PIPE); istream = sp.get_stdout_pipe() dstream = Gio.DataInputStream(base_stream=istream) while True: line, l = dstream.read_line_utf8() if line == None: break if line.startswith('-'): name = line[53:] if GLib.Regex.match_simple("\.(jpe?g|png|gif)$", name, GLib.RegexCompileFlags.CASELESS, 0): namelist.append(name) # zipfile speed now = time.time() for name in namelist: with zipfile.ZipFile("test.cbz") as o: data = o.read(name) stream = Gio.MemoryInputStream.new_from_data(data) p = GdkPixbuf.Pixbuf.new_from_stream(stream) zipfile_list.append(p) stream.close() print(time.time() - now) # unzip command speed now2 = time.time() for name in namelist: sp = Gio.Subprocess.new(["unzip", "-p", "test.cbz", name], Gio.SubprocessFlags.STDOUT_PIPE) stream = sp.get_stdout_pipe() p = GdkPixbuf.Pixbuf.new_from_stream(stream, None); unzip_list.append(p) stream.close() print(time.time() - now2)
少し大きめの cbz を用意して。
やはり zipfile モジュールのほうが少し展開が早いんだね。
いや、Gjs で作りかえた Comipoli の遅さはこんなレベルじゃないんだが。
ぶっちゃけ二倍くらい表示に時間が掛かる、とても出せるシロモノではない。
やっぱり Gjs が遅いのかも。
Gjs で同様なサンプルをと思ったけど time.time() の代替は何だ?
g_timer_new とかってバインドされていないのね、GDateTime あたりかな。
それとも他に原因があるかもしれないし、今日はここまで。
ただ Gjs への書き換えをやったおかげで beta12 で多重展開していたのを見つけた。
修正したらスゲェ速くなったので PyGObject のまま beta13 公開。
たまにはこうやって丸ごと書き換えるといいこともあるもんだ。