小编Rul*_*rld的帖子

如何找出我的代码中哪些部分在Python中效率低下

在上一个问题中,我问过多处理,使用多个内核使程序运行得更快,有人告诉我:

通常情况下,使用更好的代码可以获得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

16
推荐指数
1
解决办法
5564
查看次数

Python - 列表返回[[...],6]

如果我运行以下代码

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循环如何创建这样的列表?

python python-3.x

14
推荐指数
2
解决办法
284
查看次数

在多个核心上运行Python

我已经创建了一个(相当大的)程序,需要很长时间才能完成,我开始研究加速程序的方法.

我发现如果我在程序运行时打开任务管理器,则只使用一个核心.

经过一些研究,我找到了这个网站: 为什么多重处理在导入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"(它甚至还没有完成!)

python multiprocessing python-3.x

7
推荐指数
1
解决办法
1万
查看次数

Python排序字​​典:键[升序]然后值[降序]

我找了很长时间,没有找到实际的答案,因为我看不到任何以升序键开始然后以降序值开头的答案。

一个更清楚的例子:

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)

这是因为它对值和键都进行了反向排序。我需要不倒转的钥匙。

我真的很感激这里的一些帮助。提前致谢!

python sorting

5
推荐指数
1
解决办法
1594
查看次数

Python 在整个列表中查找字符串的公共部分并将其从每个项目中删除

我有一个与此类似的文件目录列表:

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

python list python-3.x

2
推荐指数
1
解决办法
1542
查看次数

Python:在列表中组合数字

我有一个清单,说

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),但是由于列表中有字符串,因此会导致错误

python processing-efficiency python-3.x

-1
推荐指数
2
解决办法
132
查看次数