[Python] 正規表現の置換とFor,Splitによる置換の処理スピード | Subaru's Husband

Subaru's Husband

python、linux、バイクなんかのネタを書きます。
一応security業界でご飯を食べてます。
備忘録がメインだと思うので、未来の自分が助かれば最高。

Webページ取得の際に、トークンやトランザクションIDを含む場合、
毎回最新の値に更新しないと正常にクローリングが
出きません。
そこで、送信リクエストの値を置換する必要があったわけで、
正規表現と自力の置換のスピードを検証してみました。
置換キーワードが最後にあっても少し時間が変わる程度でした。
for loop replace start : 12:45:34
for loop replace end : 12:47:38
re replace start   : 12:47:38
re replace end : 12:47:52
re replace compile start : 12:47:52
re replace compile end : 12:48:07

結果はやっぱり、正規表現の置換が圧倒的に早いですね。
毎回コンパイルしても数秒しか変わらなかったです。

# -*- coding:utf-8 -*-
import re
import datetime
token_str = 'transactionid'
token_data = 'test'
token_test = '({0}=.*?\&)'.format(token_str)
p = re.compile(token_test)
loop_cnt = 500000
body = 'transactionid=77da7256ba2e785b8428745ed2bdc81dd94bf650&mode=confirm'
while True:
body += '&test=test'
if len(body) >= 1000:
break

print body
#==================================================================================================
print '{0:25} : {1}'.format('for loop replace start',datetime.datetime.now().strftime('%H:%M:%S'))
#==================================================================================================
i = 0
while True:
generate_body=''
tmp_list = body.split('&')
for tmp in tmp_list:
if tmp.find(tmp) != -1:
_name = tmp.split('=',1)[0]
_data = tmp.split('=',1)[1]

if _name == token_str:
generate_body += _name + '=' + token_data + '&'
else:
generate_body += tmp + '&'

# 最後の&を削除
generate_body = generate_body.rstrip('&')

i +=1
if i==loop_cnt:
break
#==================================================================================================
print '{0:25} : {1}'.format('for loop replace end',datetime.datetime.now().strftime('%H:%M:%S'))
#==================================================================================================
#==================================================================================================
print '{0:25} : {1}'.format('re replace start',datetime.datetime.now().strftime('%H:%M:%S'))
#==================================================================================================
i = 0
while True:
if body.find(token_str) != -1:
generate_body = p.sub(token_str + '=' + token_data + '&',body)
generate_body = generate_body.rstrip('&')
i +=1
if i==loop_cnt:
break
#==================================================================================================
print '{0:25} : {1}'.format('for loop replace end',datetime.datetime.now().strftime('%H:%M:%S'))
#==================================================================================================
#==================================================================================================
print '{0:25} : {1}'.format('re replace compile end',datetime.datetime.now().strftime('%H:%M:%S'))
#==================================================================================================
i = 0
while True:
if body.find(token_str) != -1:
p = re.compile(token_test)
generate_body = p.sub(token_str + '=' + token_data + '&',body)
generate_body = generate_body.rstrip('&')
i +=1
if i==loop_cnt:
break
#==================================================================================================
print '{0:25} : {1}'.format('re replace compile end',datetime.datetime.now().strftime('%H:%M:%S'))
#==================================================================================================