gpt4 book ai didi

python - 搜索命名元组列表的最快方法?

转载 作者:太空狗 更新时间:2023-10-30 00:08:44 25 4
gpt4 key购买 nike

我有一个命名元组列表。每个命名元组都是我创建的 DataPoint 类型,如下所示:

class DataPoint(NamedTuple):
data: float
location_zone: float
analysis_date: datetime
error: float

在我的代码中的不同点,我必须通过特定属性获取列表中的所有 DataPoints。以下是我如何为 analysis_date 做的,我对其他属性有类似的功能:

def get_data_points_on_date(self, data_points, analysis_date):
data_on_date = []
for data_point in data_points:
if data_point.analysis_date == analysis_date:
data_on_date.append(data_point)
return data_on_date

这在具有数千个点的列表上调用了 >100,000 次,因此它显着降低了我的脚本速度。

我可以做一个字典来代替列表来显着加快速度,但是因为我需要搜索多个属性,所以没有明显的键。我可能会选择占用最多时间的函数(在本例中为 analysis_date),并将其用作键。但是,这会显着增加我的代码的复杂性。除了散列之外,还有什么让我逃避的散列/巧妙的散列方法吗?

最佳答案

也许内存中的 SQLite 数据库(带有列索引)可以提供帮助。它甚至有一种方法可以将行映射到命名元组,如 Mapping result rows to namedtuple in python sqlite描述。

如需更完整的解决方案,请参阅 http://peter-hoffmann.com/2010/python-sqlite-namedtuple-factory.html .


基于以上两个链接的基本示例:

from typing import NamedTuple
from datetime import datetime
import sqlite3


class DataPoint(NamedTuple):
data: float
location_zone: float
analysis_date: datetime
error: float


def datapoint_factory(cursor, row):
return DataPoint(*row)


def get_data_points_on_date(cursor, analysis_date):
cursor.execute(
f"select * from datapoints where analysis_date = '{analysis_date}'"
)
return cursor.fetchall()


conn = sqlite3.connect(":memory:")
c = conn.cursor()
c.execute(
"create table datapoints "
"(data real, location_zone real, analysis_date text, error timestamp)"
)
c.execute(
"create index if not exists analysis_date_index on datapoints (analysis_date)"
)


timestamp = datetime.now().isoformat()
data_points = [
DataPoint(data=0.5, location_zone=0.1, analysis_date=timestamp, error=0.0)
]

for data_point in data_points:
c.execute(f"insert into datapoints values {tuple(data_point)}")

conn.commit()
c.close()

conn.row_factory = datapoint_factory
c = conn.cursor()

print(get_data_points_on_date(c, timestamp))
# [DataPoint(data=0.5, location_zone=0.1, analysis_date='2019-07-19T20:37:38.309668', error=0)]
c.close()

关于python - 搜索命名元组列表的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57117157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com