是否有可能优化此python代码,使其执行速度更快?

时间:2019-08-30 10:29:49

标签: python python-2.7

我有这个执行每秒约11万行的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;

2 个答案:

答案 0 :(得分: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]

但是如果您真的需要所有这些行,也许您应该看看。通常,通过在处理数据之前对数据进行过滤,您可以采用更具结构的方式来安全循环。

答案 1 :(得分:0)

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