1

我有这个执行 ~110k 行/秒的 python 代码。我想知道是否有可能让它更快?

我正在从 SQL 查询数据,需要将其格式化为 json

SQLquery= "SELECT value2 FROM mytable";
cursor.execute(SQLquery)

try:
    ReturnedQuery = cursor.fetchall()    
except Exception as ex:
    pass

if(cursor.description):
        #print(ReturnedQuery)
        colTypes = cursor.description
        column_names = [column[0] for column in colTypes]
        NrOfColumns = len(column_names)
        NrOfRows = len(ReturnedQuery)
        print(NrOfRows)
        Time1 = datetime.datetime.now()
        data = []
        for row in ReturnedQuery:
            i = 0
            dataRow = collections.OrderedDict()
            for field in row:
                dataRow[column_names[i]] = field
                i = i + 1
            data.append(dataRow)
        Time2 = datetime.datetime.now()
        TimeDiff =Time2 -Time1
        print(TimeDiff)

connection.commit()
cursor.close()

从 SQL 查询一列会返回:[(0.2,), (0.3,)]

我需要将其格式化为如下所示:

[OrderedDict([('value2', 0.2)]), OrderedDict([('value2', 0.3)])]

编辑: 我过滤了查询以获得我想要的内容。我正在使用 TimeScaleDB,所以我使用了以下查询。

SELECT time_bucket('30 minutes', datetime) AS thirty_min,
AVG(value3) AS value3
FROM mytable
WHERE datetime > '2019-1-1 12:0:0.00' AND datetime < '2019-1-12 12:0:0.00'
GROUP BY thirty_min
ORDER BY thirty_min;
4

2 回答 2

0

您可以使用列表理解并尽可能快地建立连接以节省几个周期。所以这可能会更有效:

SQLquery= "SELECT value2 FROM mytable"
cursor.execute(SQLquery)

try:
    result = cursor.fetchall()    
except Exception as ex:
    pass

if cursor.description:
    column_names = [column[0] for column in cursor.description]
else:
    column_names = []
cursor.close()

if column_names:
    data = [OrderedDict(zip(column_names, row)) for row in result]

但是,如果您真的首先需要所有这些行,也许您应该看看。通常通过在处理数据之前过滤数据,您可以以更结构化的方式保护循环。

于 2019-08-30T10:41:32.453 回答
0

假设您受到 CPU 的瓶颈(因为 python 使用单进程),我建议您尝试使用 multiprocessing 模块来拆分 CPU 负载。您可以将获取的列复制到列表并根据核心数量对其进行拆分,并创建单独的进程来处理拆分的数据以利用多个核心。在将结果写入进程之间的相同共享变量时可能会出现一个问题。我已经使用多处理模块中的队列来克服这个问题。

于 2019-08-30T11:39:19.073 回答