前置き
pythonでコロン区切りのMACアドレスを取得したいと思っていた.すると,
という記事があった.
しかしながら, struct というものを知らなかったので,さっぱり何がおきているのかわからない… そこで, struct を使わない形で書いてみるか,と考えた.
書いた
":".join([hex(n >> (5 - i) * 8 & 0xff)[2:].zfill(2) for (i, n) in enumerate([uuid.getnode()] * 6)])
uuid.getnode
は48bit区切りの物理アドレスを返すらしいので,
それの下位8bitを取ってくる.
速度比較した
from time import time import uuid import struct a = time() for _ in xrange(1000): "-".join([hex(n >> (5 - i) * 8 & 0xff)[2:].zfill(2) for (i, n) in enumerate([uuid.getnode()] * 6)]) b = time() for _ in xrange(1000): "-".join([hex(fragment)[2:].zfill(2) for fragment in struct.unpack("BBBBBB", struct.pack("!Q", uuid.getnode())[2:])]) c = time() print b - a print c - b
自作と本家,それぞれ1000回計測した.
結果
0.0104370117188 0.00326585769653
遅い,遅すぎるぜベイベー… 本家とくらべ,3倍近い時間がかかっている…
だがしかし
落ちついて,ソースコードの長さを見て欲しい.
":".join([hex(fragment >> (5 - i) * 8 & 0xff)[2:].zfill(2) for (i, fragment) in enumerate([uuid.getnode()] * 6)]) "-".join([hex(fragment)[2:].zfill(2) for fragment in struct.unpack("BBBBBB", struct.pack("!Q", uuid.getnode())[2:])])
なんと,4文字の減少が得られた!!すごい!!!
結論
やはり詳しい人のソースコードは素晴しいということが今回の一件から判った. 後でstruct に関しても理解を深めたい💪