gpt4 book ai didi

python - Python 中的循环效率

转载 作者:太空宇宙 更新时间:2023-11-03 18:00:41 24 4
gpt4 key购买 nike

我正在寻找一种更快地执行循环的方法。使用当前代码,计算需要很长时间。所以我正在寻找一种方法来提高我的代码效率。

编辑:我不认为解释,我需要创建一个程序来执行 8 位数字的所有可能组合,不要忘记包括大写、小写和数字..然后加密 md5 这些可能的组合并保存它们到一个文件。但我有新的问题,这个过程要花63年的时间才能权衡这个文件?,作为脚本的结尾?最近购买了一个 vps 服务器来完成这个任务,但如果需要 63 年,最好不要尝试哈哈..

我是编码新手,感谢所有帮助

import hashlib
from random import choice

longitud = 8
valores = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

def enc(string):
m = hashlib.md5()
m.update(string.encode('utf-8'))
return m.hexdigest()

def code():
p = ""
p = p.join([choice(valores) for i in xrange(longitud)])
text = p
return text

i = 1
for i in xrange(2000000000000000000):
cod = code()
md = enc(cod)
print cod
print md
i += 1
print i
f=open('datos.txt','a')
f.write("%s " % cod)
f.write("%s" % md)
f.write('\n')
f.close()

最佳答案

您没有充分利用具有多个中央处理单元的现代计算机的全部功能!这是迄今为止您可以在这里进行的最佳优化,因为这是CPU 限制。注意:对于 I/O 绑定(bind)操作 multithreading(使用线程模块)是合适的。

那么让我们看看 python 如何使用 multiprocessing module 轻松做到这一点(阅读评论):

import hashlib
# you're sampling a string so you need sample, not 'choice'
from random import sample
import multiprocessing
# use a thread to synchronize writing to file
import threading

# open up to 4 processes per cpu
processes_per_cpu = 4
processes = processes_per_cpu * multiprocessing.cpu_count()
print "will use %d processes" % processes
longitud = 8
valores = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
# check on smaller ranges to compare before trying your range... :-)
RANGE = 200000
def enc(string):
m = hashlib.md5()
m.update(string.encode('utf-8'))
return m.hexdigest()

# we synchronize the results to be written using a queue shared by processes
q = multiprocessing.Manager().Queue()

# this is the single point where results are written to the file
# the file is opened ONCE (you open it on every iteration, that's bad)
def write_results():
with open('datos.txt', 'w') as f:
while True:
msg = q.get()
if msg == 'close':
break;
else:
f.write(msg)

# this is the function each process uses to calculate a single result
def calc_one(i):
s = ''.join(sample(valores, longitud))
md = enc(s)
q.put("%s %s\n" % (s, md))

# we start a process pool of workers to spread work and not rely on
# a single cpu
pool = multiprocessing.Pool(processes=processes)

# this is the thread that will write the results coming from
# other processes using the queue, so it's execution target is write_results
t = threading.Thread(target=write_results)
t.start()
# we use 'map_async' to not block ourselves, this is redundant here,
# but it's best practice to use this when you don't HAVE to block ('pool.map')
pool.map_async(calc_one, xrange(RANGE))
# wait for completion
pool.close()
pool.join()
# tell result-writing thread to stop
q.put('close')
t.join()

这段代码中可能还有更多的优化需要完成,但是对于像您现在这样的任何 CPU 密集型任务来说,一个主要的优化是使用多处理。

注意:文件写入的一个简单优化是聚合队列中的一些结果并将它们写入在一起(如果您有许多 CPU 超过单个写入线程的速度)

注释 2:由于 OP 想要检查内容的组合/排列,因此应该注意,有一个模块可以做到这一点,它称为 itertools

关于python - Python 中的循环效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27730296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com