收集python对象中的dict框架,使用适当和快速的数据结构。

2024-06-26 11:05:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的API每秒提供128个信号(和信号质量值)作为dict中的dict。我想将它们收集到1秒(或更多)的窗口中。你知道吗

我的原生方法是使用相同的dict结构并将值附加到列表中(如:Appending values to dictionary in Python)。你知道吗

参见示例:

# the API provides data like this
def getFrame(i):
    return {"X":
                {"value" : i,
                 "quality": i*2},
             "AF3":
                {"value" : i*3,
                 "quality": i*4}
             }


# object to collect single frames
class WindowDto(object):
    def __init__(self, windowSize, header):
        self.header = header
        self.windowSize = windowSize
        self.data = {}
        for key in self.header:
            self.data[key] = {"value": [], "quality": []}

    def addFrame(self, frame):
        for key, val in frame.iteritems():
            field = self.data[key]
            field["value"].append(val["value"])
            field["quality"].append(val["quality"])


# the keys of a frame are known
header = ["X", "AF3"]
# the max frame count is also known, but not used yet
maxFrameCount = 8        

dto = WindowDto(maxFrameCount, header)
for i in range(8):
    dto.addFrame(getFrame(i))

print(dto.data)
# {'X': {'quality': [0, 2, 4, 6, 8, 10, 12, 14], 'value': [0, 1, 2, 3, 4, 5, 6, 7]}, 
#  'AF3': {'quality': [0, 4, 8, 12, 16, 20, 24, 28], 'value': [0, 3, 6, 9, 12, 15, 18, 21]}}

我假设addFrame()方法是一个潜在的瓶颈,因为我必须迭代整个结构。我正在寻找一种更聪明的方法来执行add操作。有什么建议吗?你知道吗

我还可以随意更改值的存储方式(例如,在数组中?)提高绩效。我知道窗口对象的标题值和最大大小。这些值稍后作为列表处理(例如sum(data["X"]["values"])),但是访问被WindowDto包装。你知道吗


Tags: the方法keyinselfdatavaluedef
1条回答
网友
1楼 · 发布于 2024-06-26 11:05:10

你做过分析吗,也许你的服务器已经足够好了?!你知道吗

import cProfile
cProfile.run('for i in range(128):dto.addFrame(getFrame(i))')
         899 function calls in 0.001 seconds
cProfile.run('for i in range(128**2):dto.addFrame(getFrame(i))')
         114691 function calls in 0.046 seconds

相关问题 更多 >