在上一个问题中,我问过多处理,使用多个内核使程序运行得更快,有人告诉我:
通常情况下,使用更好的代码可以获得100x +优化,而使用多处理可以获得4倍的改进和额外的复杂性
然后他们建议我应该:
使用分析器来了解什么是慢,然后专注于优化.
所以我回答了这个问题:你如何描述一个脚本?
在这里,我发现cProfile并将其实现到一些测试代码中,以了解它是如何工作的.
这是我的代码:
import cProfile
def foo():
for i in range(10000):
a = i**i
if i % 1000 == 0:
print(i)
cProfile.run('foo()')
Run Code Online (Sandbox Code Playgroud)
然而,在运行之后,这就是我得到的:
0
1000
2000
3000
4000
5000
6000
7000
8000
9000
1018 function calls in 20.773 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 20.773 20.773 <string>:1(<module>)
147 0.000 0.000 0.000 0.000 rpc.py:150(debug)
21 0.000 0.000 0.050 0.002 rpc.py:213(remotecall)
21 0.000 0.000 0.002 0.000 …Run Code Online (Sandbox Code Playgroud) python performance profiling processing-efficiency python-3.x
如果我运行以下代码
data = [[1,2],[3,4],[5,6]]
for x in data:
print(x[0])
for x[0] in data:
print(x)
Run Code Online (Sandbox Code Playgroud)
我得到以下输出
1
3
5
[[1, 2], 6]
[[3, 4], 6]
[[...], 6]
Run Code Online (Sandbox Code Playgroud)
我最终得到一个列表[[...], 6],但是这个[...]列表是什么?
它不正常的行为,因为调用y = [[...], 6]然后将下面的语句显示[...]为0
>>> print(y)
[[Ellipsis], 6]
>>> print(y[0])
[0]
Run Code Online (Sandbox Code Playgroud)
但是,当我在顶部运行代码并键入以下语句时,结果没有意义:
>>> print(x)
[[...], 6]
>>> print(x[0])
[[...], 6]
>>> print(x[0][0])
[[...], 6]
>>> print(x[0][0][0])
[[...], 6]
Run Code Online (Sandbox Code Playgroud)
然而不知何故,这两个结果都是6
>>> print(x[1])
6
>>> print(x[0][1])
6
Run Code Online (Sandbox Code Playgroud)
回顾一下这个问题:这怎么可能,[...]代表什么,以及顶部的for循环如何创建这样的列表?
我已经创建了一个(相当大的)程序,需要很长时间才能完成,我开始研究加速程序的方法.
我发现如果我在程序运行时打开任务管理器,则只使用一个核心.
经过一些研究,我找到了这个网站:
为什么多重处理在导入numpy后只使用一个核心?这提供了一个解决方案os.system("taskset -p 0xff %d" % os.getpid()),但这对我不起作用,我的程序继续在单核上运行.
然后我发现这个: python是否能够在多个内核上运行?,指向使用多处理.
因此,在研究了多处理之后,我遇到了关于如何使用它的纪录片https://docs.python.org/3/library/multiprocessing.html#examples
我试过这段代码:
from multiprocessing import Process
def f(name):
print('hello', name)
if __name__ == '__main__':
p = Process(target=f, args=('bob',))
p.start()
p.join()
a = input("Finished")
Run Code Online (Sandbox Code Playgroud)
运行代码后(不是在IDLE中)它说:
Finished
hello bob
Finished
Run Code Online (Sandbox Code Playgroud)
注意:说完之后我第一次按下回车
所以在此之后我现在更加困惑,我有两个问题
第一:它仍然没有多核运行(我有一个8核Intel i7)
第二:为什么在它甚至运行if语句代码之前输入"Finished"(它甚至还没有完成!)
我找了很长时间,没有找到实际的答案,因为我看不到任何以升序键开始然后以降序值开头的答案。
一个更清楚的例子:
d = {'banana':3, 'orange':5, 'apple':5}
out: [('apple', 5), ('orange', 5), ('banana', 3)]
Run Code Online (Sandbox Code Playgroud)
在做了一些研究之后,我得出了这样的结论:
sorted(d.items(), key=operator.itemgetter(1,0), reverse=True)
out: [('orange', 5), ('apple', 5), ('banana', 3)]
Run Code Online (Sandbox Code Playgroud)
这是因为它对值和键都进行了反向排序。我需要不倒转的钥匙。
我真的很感激这里的一些帮助。提前致谢!
我有一个与此类似的文件目录列表:
path/new/stuff/files/morefiles/A/file2.txt
path/new/stuff/files/morefiles/B/file7.txt
path/new/stuff/files/morefiles/A/file1.txt
path/new/stuff/files/morefiles/C/file5.txt
Run Code Online (Sandbox Code Playgroud)
我正在尝试删除相同路径的开头从每个列表中删除,然后从每个文件中删除它。
列表可以是任意长度,在示例中,我将尝试将列表更改为:
A/file2.txt
B/file7.txt
A/file1.txt
C/file5.txt
Run Code Online (Sandbox Code Playgroud)
像re.sub(r'.*I', 'I', filepath)和这样的方法filepath.split('_', 1)[-1]可以用于替换,但我不确定如何在文件路径列表中找到公共部分
笔记:
我正在使用 Windows 和 python 3
我有一个清单,说
x = [0,1,2,3,"a","b","cd"]
Run Code Online (Sandbox Code Playgroud)
我想保留最小的数字和所有字母,因此在示例中它将变为
x = [0,"a","b","cd"]
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?理想情况下,代码将非常高效,因为我正在为数百万个列表执行此操作。
尝试:我尝试找到min(x),但是由于列表中有字符串,因此会导致错误