Python中的快速GUIDs

问题描述 投票:0回答:1

我在Python中开发了一个性能关键型和CPU密集型的应用程序,为了达到可接受的性能,我使用PyPy和多个用os.fork生成的进程。为了达到可接受的性能,我使用PyPy和用os.fork生成的多个进程。总的来说,我现在对性能感到满意,它接近编译语言的性能。但我必须生成大量的 GUIDs,最初我使用了。

import uuid
print(str(uuid.uuid4()))

来生成UUIDs. 但剖析发现,UUID生成占了总运行时间的20%左右。这似乎是由于调用了 os.urandom()uuid.uuid4() 这在某些系统上似乎很慢(包括OS X)。然后我把 os.urandom()random.getrandbits():

 import random
 str(UUID(int=random.getrandbits(128), version=4))

这是快。但现在发现,我的并行运行的工作进程会大量生成重复的GUID。

我怀疑python的伪数生成器是以当前时间为种子的,这就是为什么不同的进程会生成相同的随机数。我想到的一个可能的解决方法是,在数字生成器的种子中加入进程的id。但是由于我不太清楚uuid和随机包是如何在内部构建的,我不确定这是否足以防止碰撞。我找到了一些替代的UUID实现,这些UUID被写成c扩展,但由于PyPy的原因,我无法使用它们。

由于某些库的原因,我使用python只是为了这个项目,而且我在python中的编码经验很少。

更新了一下。

现在我已经添加了 seed(SystemRandom().getrandbits(128)) 叉后。因此,用devurandom来播种PRNG。到目前为止,这个方法似乎效果不错。

我很喜欢rossum提出的用主进程RNG来播种子进程的想法。但现在想来,我想使用操作系统的RNG来播种RNG应该更加安全。尤其是,因为我的应用也是分布式运行在多个节点上。IMHO用mac地址和时间戳来播种初始RNG,然后使用rossums的建议应该也可以。

python-3.x random multiprocessing guid pypy
1个回答
1
投票

发生这种情况是因为进程分叉导致每个进程都有相同内存的副本,包括相同PRNG状态的副本。 与此相反,在分叉后用 SystemRandom 解决了这一问题,因为由 SystemRandom 是全局性的。操作系统 而不是单个过程。

© www.soinside.com 2019 - 2024. All rights reserved.