我有一個 CSV 檔案,其中有 15000 個 mac 地址,我想找到每個 mac 地址的供應商映射。
我有一個 json 檔案,我可以在其中找到所有通過 mac 前綴的供應商映射,如下所示:
oui.json
{
"VendorMapping": [
{
"_mac_prefix": "00:00:00",
"_vendor_name": "XEROX CORPORATION"
},
{
"_mac_prefix": "00:00:01",
"_vendor_name": "XEROX CORPORATION"
},
{
"_mac_prefix": "00:00:02",
"_vendor_name": "XEROX CORPORATION"
},
{
"_mac_prefix": "00:00:03",
"_vendor_name": "XEROX CORPORATION"
},
{
"_mac_prefix": "00:00:04",
"_vendor_name": "XEROX CORPORATION"
},
....
我通過在我的 CSV 中創建一個 foo 回圈和在 json 中創建一個 foo 回圈來開始我的腳本,以便為我的 CSV 的每個 mac 地址找到匹配的供應商映射:
import json
import os
from time import time
start = time()
f = open("oui.json")
data = json.load(f)
file = open("data.csv")
content = file.readlines()[1:]
for line in content:
mac = line.split(',')[1]
print(mac)
for oui in data["VendorMapping"]:
if mac.upper().startswith(oui["_mac_prefix"]):
print(oui["_vendor_name"])
break
print(f'Total time: {time() - start}')
我花了 49 秒來獲取所有 mac 地址的所有供應商映射。但我想讓它更快。
為此,我決定像這樣使用 asyncIO:
import json
import asyncio
import os
from time import time
start = time()
f = open('oui.json')
data = json.load(f)
file = open("api/data.csv")
content = file.readlines()[1:]
tasks = []
async def vendormapping(line):
mac = line.split(',')[1]
print(mac)
for oui in data["VendorMapping"]:
if mac.upper().startswith(oui["_mac_prefix"]):
print(oui["_vendor_name"])
break
async def main():
for line in content:
tasks.append(vendormapping(line))
await asyncio.gather(*tasks)
asyncio.run(main())
print(f"All took {time() - start}")
我認為我做錯了什么,因為它需要 39 秒才能繼續。我期待更快的東西。有人可以幫幫我嗎?
謝謝,
uj5u.com熱心網友回復:
asyncio 是單執行緒 IO。即使你是異步的,你實際上并沒有并行處理任何東西。當您的作業負載涉及大量等待時,更多使用 AsyncIO。在這種情況下,無需等待。它只是純粹的吞吐量。
我已經重構了您的代碼以使用多處理。這比 AsyncIO 更適合原始吞吐量。在我的測驗中,我將時間從 15 秒縮短到 4 秒。(使用我猜的欺騙資料)
def vendormapping(line):
mac = line.split(',')[1]
print(mac)
for oui in data["VendorMapping"]:
if mac.upper().startswith(oui["_mac_prefix"]):
print(oui["_vendor_name"])
break
def main():
with Pool() as p:
p.map(vendormapping, content)
if __name__ == '__main__':
main()
print(f"All took {time() - start}")
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/494315.html
上一篇:如果時間還沒有到,退出sub
