繁体   English   中英

有没有办法加快这个 Python 脚本?

[英]Is there a way to speed up this Python script?

我对 Python 还很陌生。 我可以编写 function 的脚本,但我想知道是否可以做些什么来加快这个脚本的速度。

有任何错误或不必要/重复的动作吗?

以下是上次运行的统计数据:

跟踪检查:[开始:2021-04-15-07:40:01 CST] [完成:2021-04-15-07:47:33 CST] [插入:172] [删除:1634] [玩家:120] [运行时间:0:07:32.203772]

我有 100,000 多名玩家通过 go 获得任何帮助!

提前致谢!

# https://requests.readthedocs.io/en/master/
import requests
# https://docs.python.org/3/library/datetime.html
import datetime
import mysql.connector
import json
import time
from time import sleep

currentTime2 = datetime.datetime.now()
currentTimeTime2 = currentTime2.strftime('%Y-%m-%d-%H:%M:%S')
cstTime = (currentTime2 - datetime.timedelta(hours=6))
cstTime2 = cstTime.strftime('%Y-%m-%d-%H:%M:%S')

# PRINT START TIME
def startTime():
    print('Tracking Check: [Start: ' + str(cstTime2) + ' CST] ', end="", flush=True)

# Script Timer
start_time = time.time()

# MySQL Connection - Open
# clanTrackingDb = mysql.connector.connect(host="db_IP", user="db_user", passwd="db-pass", db="DB")

# API Token
token = 'token'

cursor = clanTrackingDb.cursor()
cursor2 = clanTrackingDb.cursor()

activeClans = 0
inactiveClans = 0
clansGained = 0
clansLost = 0
playersInserted = 0
recordsDeleted = 0
recordsInserted = 0
valuesDelete = []
valuesInsert = []
valuesUpdate = []

# Clan Check Query
getPlayerTagsQuery = (
    "SELECT * FROM `playerRiverRaceHistory_merge` WHERE dataMerged = 'No' LIMIT 120")

cursor.execute(getPlayerTagsQuery)

result = cursor.fetchall()

resultCount = cursor.rowcount

tags = [i[1] for i in result]

for tag in tags:
    cursor5 = clanTrackingDb.cursor()

    getPlayerMergeStatusQuery = ("SELECT * FROM playerRiverRaceHistory WHERE playerTag = '%s'" % (tag))
                
    cursor5.execute(getPlayerMergeStatusQuery)

    getPlayerMergeStatusResult = cursor5.fetchall()

    getPlayerMergeStatusRowCount = cursor5.rowcount

    # print(str(tag) + ' - ' + str(getRiverRaceHistoryRowCount))

    if (getPlayerMergeStatusRowCount == 0):

        dataMerged = 'Yes'

        cursor3 = clanTrackingDb.cursor()
        updatePlayerMergeStatusQuery = ("UPDATE playerRiverRaceHistory_merge SET dataMerged = %s WHERE playerTag = %s")
        cursor3.execute(updatePlayerMergeStatusQuery, (dataMerged, tag))
        clanTrackingDb.commit()
        cursor3.close()

        #playersInserted = playersInserted + 1

    else:
        for x in getPlayerMergeStatusResult:
            db_playerTag = x[1]
            db_playerClanTag = x[3]
            db_playerClanName = x[4]
            db_warLeague = x[5]
            db_warDate = x[6]
            db_fameCollected = x[7]
            db_repairCollected = x[8]
            db_decksUsed = 0
            # print(str(db_playerTag) + ' - ' + str(db_warDate))

            cursor2 = clanTrackingDb.cursor()
            checkHistory2Query = ("SELECT * FROM playerRiverRaceHistory2 WHERE playerTag = '%s' AND playerClanTag = '%s' AND warDate = '%s'" % (db_playerTag, db_playerClanTag, db_warDate))         
            cursor2.execute(checkHistory2Query)
            checkHistory2Result = cursor2.fetchall()
            checkHistory2ResultRowCount = cursor2.rowcount

            if(checkHistory2ResultRowCount == 0):
                #print("Already in DB")
                # deleteHistoryQuery = ("DELETE FROM playerRiverRaceHistory WHERE playerTag = '%s' AND playerClanTag = '%s' AND warDate = '%s'" % (db_playerTag, db_playerClanTag, db_warDate))
                # cursor4 = clanTrackingDb.cursor()
                # cursor4.execute(deleteHistoryQuery)
                # clanTrackingDb.commit()
                # cursor4.close
                # #print("Record Deleted - 1")
                recordsDeleted = recordsDeleted + 1
                valuesDelete.append((db_playerTag, db_playerClanTag, db_warDate))
            else:
                #print("Not in DB")
                # insertHistory2Query = ("INSERT INTO playerRiverRaceHistory2 (playerTag, playerClanTag, playerClanName, warLeague, warDate, fameCollected, repairCollected, decksUsed) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)")
                # cursor4 = clanTrackingDb.cursor()
                # cursor4.execute(insertHistory2Query, (db_playerTag, db_playerClanTag, db_playerClanName, db_warLeague, db_warDate, db_fameCollected, db_repairCollected, db_decksUsed))
                # clanTrackingDb.commit()
                # cursor4.close
                #print("Data Inserted")
                recordsInserted = recordsInserted + 1
                valuesInsert.append((db_playerTag, db_playerClanTag, db_playerClanName, db_warLeague, db_warDate, db_fameCollected, db_repairCollected, db_decksUsed))

                dataMerged = "Yes"
                # cursor3 = clanTrackingDb.cursor()
                # updatePlayerMergeStatusQuery = ("UPDATE playerRiverRaceHistory_merge SET dataMerged = %s WHERE playerTag = %s")
                # cursor3.execute(updatePlayerMergeStatusQuery, (dataMerged, db_playerTag))
                # clanTrackingDb.commit()
                # cursor3.close()
                #print("Merge Status Updated")
                valuesUpdate.append((dataMerged, db_playerTag))

                # deleteHistoryQuery = ("DELETE FROM playerRiverRaceHistory WHERE playerTag = '%s' AND playerClanTag = '%s' AND warDate = '%s'" % (db_playerTag, db_playerClanTag, db_warDate))
                # cursor4 = clanTrackingDb.cursor()
                # cursor4.execute(deleteHistoryQuery)
                # clanTrackingDb.commit()
                # cursor4.close
                #print("Record Deleted - 2")
                recordsDeleted = recordsDeleted + 1
                valuesDelete.append((db_playerTag, db_playerClanTag, db_warDate))

            cursor2.close()

    cursor5.close()

insertHistory2Query = ("INSERT INTO playerRiverRaceHistory2 (playerTag, playerClanTag, playerClanName, warLeague, warDate, fameCollected, repairCollected, decksUsed) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)")
cursor6 = clanTrackingDb.cursor()
cursor6.executemany(insertHistory2Query, valuesInsert)
clanTrackingDb.commit()
cursor6.close()

updatePlayerMergeStatusQuery = ("UPDATE playerRiverRaceHistory_merge SET dataMerged = %s WHERE playerTag = %s")
cursor7 = clanTrackingDb.cursor()
cursor7.executemany(updatePlayerMergeStatusQuery, valuesUpdate)
clanTrackingDb.commit()
cursor7.close()

deleteHistoryQuery = ("DELETE FROM playerRiverRaceHistory WHERE playerTag = '%s' AND playerClanTag = '%s' AND warDate = '%s'")
cursor8 = clanTrackingDb.cursor()
cursor8.executemany(deleteHistoryQuery, valuesDelete)
clanTrackingDb.commit()
cursor8.close()

# Log Print
currentTime = datetime.datetime.now()
currentTimeTime = currentTime.strftime('%Y-%m-%d-%H:%M:%S')
currentTime2 = (currentTime - datetime.timedelta(hours=5))
currentTime3 = currentTime2.strftime('%Y-%m-%d-%H:%M:%S')

scriptTime = time.time() - start_time
scriptTime2 = str(datetime.timedelta(seconds=scriptTime))

startTime()
print('[Finish: ' + str(currentTime3) + ' CST] [Inserted: ' + str(recordsInserted) + '] [Deleted: ' + str(recordsDeleted) + '] [players: ' + str(resultCount) + '] [Runtime: ' + str(scriptTime2) + ']')

cursor.close()
cursor2.close()
clanTrackingDb.close()
  • 听起来每个playerTag都有多行。 但是为什么每一行都有dataMerged呢? 也许需要一个单独的Players表?

  • SET dataMerged至少出现 3 次——创建一个子程序。

  • 一些可能有帮助的索引:

     INDEX(playerTag, playerClanTag, warDate) INDEX(dataMerged)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM