Python 3.x 使用Python创建唯一键的更有效方法

Python 3.x 使用Python创建唯一键的更有效方法,python-3.x,pandas,Python 3.x,Pandas,只是在想是否有更好的方法 目前我有一个工作函数,可以根据给定的索引或数字生成5个字母数字的键码 问题是生成它需要太多时间。我希望至少有3000万张唱片,我试着用100万张唱片来运行它,这需要永远的时间 是否有人可以建议如何使此代码更干净、更快?提前谢谢 import time def generate_unique(index_id): BASE = 35; # zero-based base3

只是在想是否有更好的方法

目前我有一个工作函数,可以根据给定的索引或数字生成5个字母数字的键码

问题是生成它需要太多时间。我希望至少有3000万张唱片,我试着用100万张唱片来运行它,这需要永远的时间

是否有人可以建议如何使此代码更干净、更快?提前谢谢

import time


def generate_unique(index_id):
    BASE = 35;                                          # zero-based
    base36 = ['0','1','2','3','4','5','6','7','8','9',
              'a','b','c','d','e','f','g','h','i','j','k',
              'm','n','o','p','q','r','s','t','u','v','w','x','y','z']

    idx = [0, 0, 0, 0, 0]

    for i in range(0, index_id - 1):
        idx[4] = idx[4] + 1
        if idx[4] == BASE:
            idx[4] = 0
            idx[3] = idx[3] + 1
            if idx[3] == BASE:
                idx[3] = 0
                idx[2] = idx[2] + 1
                if idx[2] == BASE:
                    idx[2] = 0
                    idx[1] = idx[1]+1
                    if idx[1] == BASE:
                        idx[1] = 0
                        idx[0] = idx[0] + 1

    return base36[idx[0]] + base36[idx[1]] + base36[idx[2]] + base36[idx[3]] + base36[idx[4]]


t1 = time.process_time()
for i in range(1, 1000000):
    generate_unique(i)
t2 = time.process_time()
print(f"Process completed successfully in {t2 - t1} seconds.")
您可以使用numpy的:

您在实现中跳过了字母“l”:如果将其添加到base36并设置BASE=36,此函数将返回相同的结果

时间:


因此,base_repr比循环解决方案快63000倍以上。

您可以尝试以下方法:

codes = []
for m in range(35):
    for l in range(35):
        for k in range(35):
            for j in range(35):
                for i in range(35):
                    codes.append(base36[m]+base36[l]+base36[k]+base36[j]+base36[i])

在我的电脑里用了不到2分钟。

它需要5位数吗?这有用吗?您好@Axe319,是的,我想要的是一个能够容纳至少1亿条记录的唯一密钥。因此,我认为一个以5个字母数字为基础的36个字符的代码就足够了。我之所以问它是否不需要5位数字,是因为像[struid.uuid4 for uuu in range1000000]这样的东西在我的机器上运行大约需要4秒钟,它给了你几乎无限的增长空间。唯一需要注意的是它是一个36字符的字符串。我认为只要它产生一个5位数的唯一代码就可以了。什么用例,你用它们作为数据的唯一键吗?了解你的工具:+1
%timeit generate_unique(1_000_000)
#169 ms ± 705 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit f'{np.base_repr(1_000_000-1, 36).lower():0>5}'
#2.67 µs ± 51.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
codes = []
for m in range(35):
    for l in range(35):
        for k in range(35):
            for j in range(35):
                for i in range(35):
                    codes.append(base36[m]+base36[l]+base36[k]+base36[j]+base36[i])