python - 如何将此函数转换为优化函数?它应该更高效地尊重时间?
问题描述
我得到了这个功能,它让用户可以检索具有特定值字段的日志。例如,如果选择字段为 getUser 并将 val1 设置为 john,则可以获取用户字段中具有 john 值的所有日志。
这些是日志的一些示例:
l1 = Log(int(time.mktime(time.strptime('Mon Mar 09 12:00:00 2020'))), 'john', 23, 'signin', 0)
l2 = Log(int(time.mktime(time.strptime('Mon Mar 09 14:10:00 2020'))), 'mary', 42, 'click', 13)
...
我的日志 = [l1,l2,...]
def registerEqualQuery(logs, field):
def query(val1):
res = []
for (index,log) in enumerate(logs):
if getattr(log, field)() == val1:
res.append(log)
return res
if field not in [’getArrivaltime’,’getUser’,’getSession’,’getEvent’,’getUsrfield’]:
raise Exception(’field name not found’)
return query
q1=registerEqualQuery(mylogs,'getUser')
result = q1('john')
这会给我 l1 作为输出。
通过下面的操作,我可以知道每秒可以得到多少查询。
s = time.time(); result = q7(’john’); e = time.time()
1/(e-s)
我想优化此功能以每秒获得更多查询。应该使用字典,但我不知道如何使用。有人可以帮忙吗?
解决方案
- 它看起来不像
index
被使用,所以没有必要enumerate
- 由于循环正在构建一个列表,因此可以将其转换为列表推导,这比重复调用
append
(https://leadsift.com/loop-map-list-comprehension/,https://nyu-cds. github.io/python-performance-tips/08-loops/)
总而言之:
def registerEqualQuery(logs, field):
def query(val1):
return [log for log in logs if getattr(log, field)() == val1]
推荐阅读
- powershell - Powershell 缺少语句块
- arrays - 我可以在 O(n) 中正确插入按字母顺序排序的列表吗?
- python - AWS beanstalk - 更新环境变量时 Python 应用程序失败
- java - 使用符号撇号(')查询在java中获取参数值
- sql-server - 我缺少哪些显式权限会阻止表级别的有效 INSERT 权限?
- javascript - 这是什么意思:公共子
(params: { new(...args: any[]): T }): Observable - jquery - 当我根据用户的操作创建新脚本时,如何用逗号包装我的输入?
- watchkit - watchOS上CloudKit的WKRefreshBackgroundTask?
- xamarin - 活动没有通过 super.onresume 异常调用
- javascript - 通过带有索引的jquery ajax发送php数组并接收数组值