我有这个执行每秒约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;
答案 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来克服这个问题。