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 …
为什么正则表达式[[:alpha:]]也匹配Notepad ++中的中文单词?例如,中文
根据Notepad ++的文档
alpha:ASCII字母
中文单词不是ASCII字母,为什么正则表达式与它们相匹配?
我对三件事感到困惑:mpirun,mpiexec和mpiexec.hydra
在我的集群上,所有这些都存在,并且所有这些都属于英特尔.
他们之间有什么区别和关系?特别是,什么是mpiexec.hydra?为什么mpiexec和hydra之间有一个点,这是什么意思?
我不明白,既然逻辑类型只有两个情况:true和false,那么为什么我们需要logical(1),logical(2),logical(4),logical(8)Fortran中?
我们只需要1 bit.
有人可以解释一下吗?
我们知道
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) 例如,定义
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)
给
我正在编写一个 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) 例如,如果我当前的 Colab 实例登录为
myColab@gmail.com
是否可以在 ipython 中获取名称“myColab”?
执行此操作的命令是什么?
我想这样做是因为我可能运行两个Colab,它们生成文件,我想用Colab帐户名标记这些文件,这样我就知道哪个帐户生成这些文件。
setlocal enabledelayedexpansion只能在批处理文件中工作吗?如何setlocal enabledelayedexpansion在cmd提示符下使用?
让我们定义:
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