小编use*_*964的帖子

Pandas 和 Numpy 中关于多线程的奇怪错误

Numpy 的大部分功能都会默认启用多线程。

例如,我在 8 核英特尔 CPU 工作站上工作,如果我运行脚本

import numpy as np    
x=np.random.random(1000000)
for i in range(100000):
    np.sqrt(x)
Run Code Online (Sandbox Code Playgroud)

linuxtop在运行过程中将显示 800% 的 CPU 使用率,例如 在此处输入图片说明 这意味着 numpy 会自动检测我的工作站有 8 个内核,并np.sqrt自动使用所有 8 个内核来加速计算。

但是,我发现了一个奇怪的错误。如果我运行一个脚本

import numpy as np
import pandas as pd
df=pd.DataFrame(np.random.random((10,10)))
df+df
x=np.random.random(1000000)
for i in range(100000):
    np.sqrt(x)
Run Code Online (Sandbox Code Playgroud)

cpu使用率是100%!! 在此处输入图片说明 这意味着如果你在运行任何 numpy 函数之前加上两个 Pandas DataFrame,那么 numpy 的自动多线程功能就会毫无预警地消失!这绝对不合理,为什么Pandas dataFrame 计算会影响Numpy 线程设置?这是一个错误吗?如何解决这个问题?


PS:

我使用 Linuxperf工具进一步挖掘。

运行第一个脚本显示

在此处输入图片说明

运行第二个脚本时显示

在此处输入图片说明

因此,两个脚本都涉及libmkl_vml_avx2.so,而第一个脚本涉及libiomp5.so似乎与 openMP 有关的附加脚本。

由于 vml 意味着英特尔矢量数学库,所以根据 vml …

python numpy pandas

26
推荐指数
1
解决办法
1864
查看次数

为什么Notepad ++中的[[:alpha:]]也匹配中文单词?

为什么正则表达式[[:alpha:]]也匹配Notepad ++中的中文单词?例如,中文

根据Notepad ++的文档

alpha:ASCII字母

中文单词不是ASCII字母,为什么正则表达式与它们相匹配?

regex notepad++

17
推荐指数
1
解决办法
866
查看次数

mpirun,mpiexec和mpiexec.hydra有什么区别和关系?

我对三件事感到困惑:mpirun,mpiexec和mpiexec.hydra

在我的集群上,所有这些都存在,并且所有这些都属于英特尔.

他们之间有什么区别和关系?特别是,什么是mpiexec.hydra?为什么mpiexec和hydra之间有一个点,这是什么意思?

mpi

15
推荐指数
1
解决办法
6868
查看次数

为什么我们需要1,2,4,8个字节来存储fortran中的逻辑变量?

我不明白,既然逻辑类型只有两个情况:truefalse,那么为什么我们需要logical(1),logical(2),logical(4),logical(8)Fortran中?

我们只需要1 bit.

有人可以解释一下吗?

fortran fortran90

9
推荐指数
1
解决办法
2990
查看次数

将序列转换为列表的功能

我们知道

list(map(f,[1,2],[3,4],[6,7]))
Run Code Online (Sandbox Code Playgroud)

相当于

[f(1,3,6),f(2,4,7)]
Run Code Online (Sandbox Code Playgroud)

我想知道是否有tolist相当于的内置函数[],所以

tolist(a,b,c,d)
Run Code Online (Sandbox Code Playgroud)

相当于[a,b,c,d].

我认为这样的函数在函数式编程中很有用.因为许多函数采用list参数而不是sequence.

当然,一个简单的自定义方式是lambda *x:list(x),但我总觉得它在语法上很麻烦,特别是在函数式编程风格中使用它

map(lambda *x:list(x),[1,2],[3,4],[6,7])
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,如果没有这样的内置tolist,我们是否可以使用FP包更加优雅地构建它toolz

PS:我实际想要实现的是添加的线程版本(我知道numpy,但我现在不想使用它)

from toolz.curried import *
import operator as op
def addwise(*args):
    return list(map(compose(reduce(op.add),lambda *x:list(x)),*args))
Run Code Online (Sandbox Code Playgroud)

然后

addwise([1,2],[3,4],[6,7])
Run Code Online (Sandbox Code Playgroud)

会给

[10, 13]
Run Code Online (Sandbox Code Playgroud)

python functional-programming toolz

8
推荐指数
1
解决办法
137
查看次数

如何将列分隔符添加到 Pandas 数据框显示

例如,定义

df=pd.DataFrame(np.random.randint(0,10,(6,6)))
df
Run Code Online (Sandbox Code Playgroud)

这在 Jupyter 笔记本中给出了以下显示

在此处输入图片说明

我的问题是是否可以向数据框添加列分隔符,例如

在此处输入图片说明


感谢您的所有答案,目前我使用以下自定义函数

def css_border(x,pos):
        return ["border-left: 1px solid red" if i in pos else "border: 0px" for i, col in enumerate(x)]
def display_df_with_delimiter(df,pos):
    return df.style.apply(partial(css_border,pos=pos), axis=1)
Run Code Online (Sandbox Code Playgroud)

display_df_with_delimiter(df,[0,1,2,5])
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

python pandas jupyter-notebook

8
推荐指数
2
解决办法
1748
查看次数

将变量从 Python 传递到 Bash

我正在编写一个 bash 脚本,其中嵌入了一个小的 python 脚本。我想将一个变量从 python 传递给 bash。经过几次搜索,我只找到了基于os.environ.

我只是无法让它发挥作用。这是我的简单测试。

#!/bin/bash

export myvar='first'

python - <<EOF
import os
os.environ["myvar"] = "second"
EOF

echo $myvar
Run Code Online (Sandbox Code Playgroud)

我预计它会输出second,但它仍然输出first. 我的脚本有什么问题?还有什么方法可以在没有的情况下传递变量export


概括

感谢所有的答案。这是我的总结。

嵌入在 bash 中的 python 脚本将作为子进程运行,根据定义,它不能影响父 bash 环境。

解决方案是从 python 中传递赋值字符串eval,然后在 bash 中传递。

一个例子是

#!/bin/bash
a=0
b=0

assignment_string=$(python -<<EOF
var1=1
var2=2
print('a={};b={}'.format(var1,var2))
EOF
)

eval $assignment_string

echo $a
echo $b
Run Code Online (Sandbox Code Playgroud)

python bash

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

如何在Google Colab中获取当前帐户名

例如,如果我当前的 Colab 实例登录为

myColab@gmail.com

是否可以在 ipython 中获取名称“myColab”?

执行此操作的命令是什么?

我想这样做是因为我可能运行两个Colab,它们生成文件,我想用Colab帐户名标记这些文件,这样我就知道哪个帐户生成这些文件。

google-colaboratory

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

在 cmd 提示符中使用“setlocalenabledelayedexpansion”

setlocal enabledelayedexpansion只能在批处理文件中工作吗?如何setlocal enabledelayedexpansion在cmd提示符下使用?

cmd batch-file

6
推荐指数
1
解决办法
2122
查看次数

大对象列表上的多处理 Pool.map() 缩放不佳:如何在 python 中实现更好的并行缩放?

让我们定义:

from multiprocessing import Pool
import numpy as np
def func(x):
    for i in range(1000):
        i**2
    return 1
Run Code Online (Sandbox Code Playgroud)

请注意,func()它做了一些事情,它总是返回一个小数字1

然后,我比较了一个 8 核并行Pool.map()v/sa 串行,python 内置,map()

n=10**3
a=np.random.random(n).tolist()

with Pool(8) as p:
    %timeit -r1 -n2  p.map(func,a)
%timeit -r1 -n2  list(map(func,a))
Run Code Online (Sandbox Code Playgroud)

这给出了:

38.4 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 2 loops each)
200 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 2 loops each) …
Run Code Online (Sandbox Code Playgroud)

python parallel-processing performance multiprocessing parallelism-amdahl

6
推荐指数
2
解决办法
1152
查看次数