【发布时间】:2018-10-10 12:13:26
【问题描述】:
我是一个业余爱好者,从 AHK 开始,然后是一些 java,现在我尝试学习 Python。 我已经搜索并找到了一些提示,但我还没有能够将它实现到我自己的代码中。 希望这里有人可以帮助我,这是一个非常短的程序。 我正在使用带有“;”的 .txt csv 数据库作为分隔符。 数据库示例:
猫通常是什么颜色的?;黑色
地球上最长的人有多高?;272 厘米
地球是圆的吗?;是的
数据库现在包含 20.000 行,这使得程序“变慢”,仅使用 25% 的 CPU(1 个核心)。
如果我可以让它使用所有 4 个内核 (100%),我想它会更快地执行任务。任务基本上是将剪贴板与数据库进行比较,如果匹配,它应该给我一个答案作为回报。也许我也可以将数据库分成 4 个部分?
现在的代码是这样的!不超过 65 行和它的工作(但要慢)。关于如何将这个过程变成多核的建议。
import time
import pyperclip as pp
import pandas as pd
import pymsgbox as pmb
from fuzzywuzzy import fuzz
import numpy
ratio_threshold = 90
fall_back_time = 1
db_file_path = 'database.txt'
db_separator = ';'
db_encoding = 'latin-1'
def load_db():
while True:
try:
# Read and create database
db = pd.read_csv(db_file_path, sep=db_separator, encoding=db_encoding)
db = db.drop_duplicates()
return db
except:
print("Error in load_db(). Will sleep for %i seconds..." % fall_back_time)
time.sleep(fall_back_time)
def top_answers(db, question):
db['ratio'] = db['question'].apply(lambda q: fuzz.ratio(q, question))
db_sorted = db.sort_values(by='ratio', ascending=False)
db_sorted = db_sorted[db_sorted['ratio'] >= ratio_threshold]
return db_sorted
def write_txt(top):
result = top.apply(lambda row: "%s" % (row['answer']), axis=1).tolist()
result = '\n'.join(result)
fileHandle = open("svar.txt", "w")
fileHandle.write(result)
fileHandle.close()
pp.copy("")
def main():
try:
db = load_db()
last_db_reload = time.time()
while True:
# Get contents of clipboard
question = pp.paste()
# Rank answer
top = top_answers(db, question)
# If answer was found, show results
if len(top) > 0:
write_txt(top)
time.sleep(fall_back_time)
except:
print("Error in main(). Will sleep for %i seconds..." % fall_back_time)
time.sleep(fall_back_time)
if name == 'main':
main()'
【问题讨论】:
-
您知道
time.sleep()的参数以秒为单位(与许多其他语言中的毫秒相反)? -
您好,感谢您的提示!可以将其更改为 0.01 而不是 1。当然会稍微加快进程,但遗憾的是 - 还不够。现在,从 20.000 行的问题中检索“答案”最多可能需要 10 秒。仍然需要多核解决方案才能使其非常快。
-
我认为你应该专注于寻找更好的算法(加快数据库中每个项目所需的恒定时间)和pruning(找到一种快速跳过部分数据库的方法,这样你就不用'根本不需要运行昂贵的模糊算法,例如,如果 db 项目不包含您的搜索查询中的任何单词)。
标签: python python-3.x pandas csv