PythonでC言語のsscanfみたいなことをやりたい。
簡単な文字列なので、split()で切り分けてint()で整数にする、とかしてました。
それが一番速いと思って。
が、違ったんです。
少なくとも、Windowsでは、ctypesを使ってC言語のランタイムのsscanfを呼び出すほうが速かった。
下のテスト用コードだと、ctypesを使ったほうが3.0秒台、split()とint()だと4.0秒台でした(何回か試して最速のもので)。
psycoをつけても、遅くなるけれど傾向は変わらず。
高速化できたといえばできたんですけれど・・・なぜか、すっきりと納得できない感じ・・・
---------------------------------------
import time
#import psyco
#psyco.profile()
import ctypes
msvcrt = ctypes.cdll.msvcrt
T = 1000 * 1000
i = ctypes.c_int()
j = ctypes.c_int()
k = ctypes.c_int()
t0 = time.time()
byref = ctypes.byref
sscanf = msvcrt.sscanf
for t in xrange(T):
sscanf("10,20,30", "%d,%d,%d", byref(i), byref(j), byref(k))
p, q, r = i.value, j.value, k.value
t1 = time.time()
for t in xrange(T):
p, q, r = (int(v) for v in "10,20,30".split(","))
t2 = time.time()
print "t1-t0=", t1 - t0
print "t2-t1=", t2 - t1
簡単な文字列なので、split()で切り分けてint()で整数にする、とかしてました。
それが一番速いと思って。
が、違ったんです。
少なくとも、Windowsでは、ctypesを使ってC言語のランタイムのsscanfを呼び出すほうが速かった。
下のテスト用コードだと、ctypesを使ったほうが3.0秒台、split()とint()だと4.0秒台でした(何回か試して最速のもので)。
psycoをつけても、遅くなるけれど傾向は変わらず。
高速化できたといえばできたんですけれど・・・なぜか、すっきりと納得できない感じ・・・
---------------------------------------
import time
#import psyco
#psyco.profile()
import ctypes
msvcrt = ctypes.cdll.msvcrt
T = 1000 * 1000
i = ctypes.c_int()
j = ctypes.c_int()
k = ctypes.c_int()
t0 = time.time()
byref = ctypes.byref
sscanf = msvcrt.sscanf
for t in xrange(T):
sscanf("10,20,30", "%d,%d,%d", byref(i), byref(j), byref(k))
p, q, r = i.value, j.value, k.value
t1 = time.time()
for t in xrange(T):
p, q, r = (int(v) for v in "10,20,30".split(","))
t2 = time.time()
print "t1-t0=", t1 - t0
print "t2-t1=", t2 - t1