正規表現のリストがあり、それらが到着したときに特定のアカウントに関連付けることができるように、それらのツイートと照合したいと思います。上記のようにルールの数が少ないと、非常に速くなりますが、ルールの量を増やすとすぐに遅くなります。
import string, re2, datetime, time, array
rules = [
[[1],["(?!.*ipiranga).*((?=.*posto)(?=.*petrobras).*|(?=.*petrobras)).*"]],
[[2],["(?!.*brasil).*((?=.*posto)(?=.*petrobras).*|(?=.*petrobras)).*"]],
]
#cache compile
compilled_rules = []
for rule in rules:
compilled_scopes.append([[rule[0][0]],[re2.compile(rule[1][0])]])
def get_rules(text):
new_tweet = string.lower(tweet)
for rule in compilled_rules:
ok = 1
if not re2.search(rule[1][0], new_tweet): ok=0
print ok
def test():
t0=datetime.datetime.now()
i=0
time.sleep(1)
while i<1000000:
get_rules("Acabei de ir no posto petrobras. Moro pertinho do posto brasil")
i+=1
t1=datetime.datetime.now()-t0
print "test"
print i
print t1
print i/t1.seconds
550のルールでテストしたところ、50 reqs/sを超えることはできませんでした。これを行うためのより良い方法はありますか?少なくとも200reqs/sが必要です
編集:ジョナサンからのヒントの後、私は速度を約5倍向上させることができましたが、私のルールを少し入れ子にしました。以下のコードを参照してください。
scope_rules = {
"1": {
"termo 1" : "^(?!.*brasil)(?=.*petrobras).*",
"termo 2" : "^(?!.*petrobras)(?=.*ipiranga).*",
"termo 3" : "^(?!.*petrobras)(?=.*ipiranga).*",
"termo 4" : "^(?!.*petrobras)(?=.*ipiranga).*",
},
"2": {
"termo 1" : "^(?!.*ipiranga)(?=.*petrobras).*",
"termo 2" : "^(?!.*petrobras)(?=.*ipiranga).*",
"termo 3" : "^(?!.*brasil)(?=.*ipiranga).*",
"termo 4" : "^(?!.*petrobras)(?=.*ipiranga).*",
}
}
compilled_rules = {}
for scope,rules in scope_rules.iteritems():
compilled_rules[scope]={}
for term,rule in rules.iteritems():
compilled_rules[scope][term] = re.compile(rule)
def get_rules(text):
new_tweet = string.lower(text)
for scope,rules in compilled_rules.iteritems():
ok = 1
for term,rule in rules.iteritems():
if ok==1:
if re.search(rule, new_tweet):
ok=0
print "found in scope" + scope + " term:"+ term
def test():
t0=datetime.datetime.now()
i=0
time.sleep(1)
while i<1000000:
get_rules("Acabei de ir no posto petrobras. Moro pertinho do posto ipiranga da lagoa")
i+=1
t1=datetime.datetime.now()-t0
print "test"
print i
print t1
print i/t1.seconds
cProfile.run('test()', 'testproof')