这个setup.py:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
extensions = (
Extension('myext', ['myext/__init__.py',
'myext/algorithms/__init__.py',
'myext/algorithms/dumb.py',
'myext/algorithms/combine.py'])
)
setup(
name='myext',
ext_modules=cythonize(extensions)
)
Run Code Online (Sandbox Code Playgroud)
没有预期的效果.我想要它生产单一的myext.so
,它做的; 但是当我通过它调用它时
python -m myext.so
Run Code Online (Sandbox Code Playgroud)
我明白了:
ValueError: Attempted relative import in non-package
Run Code Online (Sandbox Code Playgroud)
由于myext
试图参考的事实.algorithms
.
知道如何让这个工作吗?
我偶然发现了gdb的自动显示功能,这非常强大和方便.打电话后
(gdb) display/i $pc
(gdb) display $rax
Run Code Online (Sandbox Code Playgroud)
每个步骤后自动显示观察值:
(gdb) si
0x0804805e in print_loop_start ()
2: $rax = 0
1: x/i $pc
=> 0x804805e <print_loop_start+6>: mov 0x4(%ebp,%eax,4),%ecx
Run Code Online (Sandbox Code Playgroud)
但是,如果不再感兴趣,我如何"取消"$ rax中的价值?
在我们的代码库中,我们有很多操作,如j*ω*X,其中j是虚数单位,ω是实数,X是复数.实际上很多循环看起来像:
#include <complex>
#include <vector>
void mult_jomega(std::vector<std::complex<double> > &vec, double omega){
std::complex<double> jomega(0.0, omega);
for (auto &x : vec){
x*=jomega;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我们利用了真实部分jomega
为零的事实并将乘法写为:
void mult_jomega_smart(cvector &vec, double omega){
for (auto &x : vec){
x={-omega*x.imag(), omega*x.real()};
}
}
Run Code Online (Sandbox Code Playgroud)
一开始,我对这种"聪明"的转变不屑一顾,因为
然而,正如一些表现回归所显示的那样,第三个论点并不成立.当比较这两种功能(见下文列表),智能版采用一贯优于-O2
以及具有-O3
:
size orig(musec) smart(musec) speedup
10 0.039928 0.0117551 3.39665
100 0.328564 0.0861379 3.81439
500 1.62269 0.417475 3.8869
1000 3.33012 0.760515 4.37877
2000 6.46696 1.56048 4.14422
10000 32.2827 9.2361 3.49528
100000 326.828 115.158 2.8381 …
Run Code Online (Sandbox Code Playgroud) 我一直认为,测试NAN
via 之间几乎没有区别
x!=x
要么
std::isnan(x)
但是,gcc为这两个版本提供了不同的汇编程序(在godbolt.org上直播):
;x!=x:
ucomisd %xmm0, %xmm0
movl $1, %edx
setne %al
cmovp %edx, %eax
ret
;std::isnan(x)
ucomisd %xmm0, %xmm0
setp %al
ret
Run Code Online (Sandbox Code Playgroud)
但是,我很难理解这两个版本.我天真的尝试编译std::isnan(x)
将是:
ucomisd %xmm0, %xmm0
setne %al ;return true when not equal
ret
Run Code Online (Sandbox Code Playgroud)
但我必须遗漏一些东西.
stdout
在写入控制台时,在Windows和Linux上缓冲的方式似乎有所不同.考虑一下这个小python脚本:
import time
for i in xrange(10):
time.sleep(1)
print "Working" ,
Run Code Online (Sandbox Code Playgroud)
在Windows上运行此脚本时,我们看到Working
一个接一个地出现在中间的第二个等待.在Linux上,我们必须等待10秒,然后立即出现整行.
如果我们将最后一行更改为print "Working"
,则每行都会单独出现在Linux上.
所以在Linux上,stdout
似乎是行缓冲而在Windows上根本没有.我们可以使用-u
-option 关闭缓冲(在这种情况下,Linux上的脚本具有与Windows上相同的行为).该文件说:
-u强制stdin,stdout和stderr完全无缓冲.
实际上,它并没有说,没有-u
-option stdin
并且stdout
是缓冲的.因此我的问题是:
stdout
将被缓冲,无论哪个操作系统?至少在Windows和Linux中就是这种情况.当信息被刷新时,我的主要关注点不是(正如一些答案所假设的),但如果stdout
没有缓冲,则可能是严重的性能损失而且不应该依赖它.
编辑:值得注意的是,对于Python3,Linux和Windows的行为是相同的(但这并不奇怪,因为行为是由print
-method 的参数显式配置的).
作为Clojure的新手,我经常难以表达最简单的事情.例如,用于替换向量中的最后一个元素
v[-1]=new_value
Run Code Online (Sandbox Code Playgroud)
在python中,我最终得到了Clojure中的以下变体:
(assoc v (dec (count v)) new_value)
Run Code Online (Sandbox Code Playgroud)
至少可以说,这是非常漫长和无意义的,或者
(conj (vec (butlast v)) new_value)
Run Code Online (Sandbox Code Playgroud)
更糟糕的是,因为它有O(n)
运行时间.
这让我觉得很傻,就像一个试图用俱乐部修理瑞士手表的穴居人.
用Clojure方法替换向量中的最后一个元素是什么?
为了支持我的O(n)
-claim for butlast
-version(Clojure 1.8):
(def v (vec (range 1e6)))
#'user/v
user=> (time (first (conj (vec (butlast v)) 55)))
"Elapsed time: 232.686159 msecs"
0
(def v (vec (range 1e7)))
#'user/v
user=> (time (first (conj (vec (butlast v)) 55)))
"Elapsed time: 2423.828127 msecs"
0
Run Code Online (Sandbox Code Playgroud)
所以基本上10次元素的数量要慢10倍.
标准不需要编译器执行返回值优化(RVO),但是从C ++ 11开始,必须移动结果。
看来,这可能会将UB引入到/破坏代码中,这在C ++ 98中是有效的。
例如:
#include <vector>
#include <iostream>
typedef std::vector<int> Vec;
struct Manager{
Vec& vec;
Manager(Vec& vec_): vec(vec_){}
~Manager(){
//vec[0]=42; for UB
vec.at(0)=42;
}
};
Vec create(){
Vec a(1,21);
Manager m(a);
return a;
}
int main(){
std::cout<<create().at(0)<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
当使用gcc(或与此相关的clang)进行编译时(为了简化示例,-O2 -fno-inline -fno-elide-constructors
我正在使用std::vector
这些build-option。如果没有这些选项以及手工类和更复杂的create
功能,则可能会触发相同的行为)对于C ++ 98(-std=c++98
)一切正常:
return a;
触发复制构造函数,它保持a
原样。m
称为(必须在a
被销毁之前发生,因为它m
是在之后构造的a
)。a
在析构函数中访问是没有问题的。a
函数称为。结果与预期的一样:21
已打印(此处为live)。 …
我在 Python 3.8 中收到以下错误,而在 Python 3.6 中则没有收到该错误。我怎样才能让它与Python 3.8一起工作?为了重现该错误,请按照此处操作: https: //github.com/davidstutz/mesh-fusion/issues/7
\n[3645:3637 0:2090] 11:04:08 Tue Jan 12 [mona@goku:pts/0 +1] ~/mesh-fusion/libfusiongpu\n$ python setup.py build_ext --inplace\nAdded OpenMP\nrunning build_ext\nskipping \'cyfusion.cpp\' Cython extension (up-to-date)\nbuilding \'cyfusion\' extension\nx86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/home/mona/venv/tsdf/lib/python3.8/site-packages/numpy/core/include -I/home/mona/venv/tsdf/include -I/usr/include/python3.8 -c cyfusion.cpp -o build/temp.linux-x86_64-3.8/cyfusion.o -ffast-math -msse -msse2 -msse3 -msse4.2 -fopenmp\nIn file included from /home/mona/venv/tsdf/lib/python3.8/site-packages/numpy/core/include/numpy/ndarraytypes.h:1822,\n from /home/mona/venv/tsdf/lib/python3.8/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n from /home/mona/venv/tsdf/lib/python3.8/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n from cyfusion.cpp:531:\n/home/mona/venv/tsdf/lib/python3.8/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning "Using …
Run Code Online (Sandbox Code Playgroud) 我喜欢使用-Wsuggest-final-types
和-Wsuggest-final-methods
编译我的代码,以便警告final
关键字可用于允许编译器更积极地优化的机会.
但有时候,建议是不正确的 - 例如,我有一个Base
带有virtual ~Base()
析构函数的类,在另一个项目中以多态方式使用,gcc建议我Base
可以标记为final
.
有没有办法"干净地"告诉编译器Base
多态使用并且不应该标记为final
?
我能想到的唯一方法是使用#pragma
指令,但我发现它使代码混乱且难以阅读.
理想情况下,我正在寻找non-final
可以在类/方法声明中添加/附加的关键字或属性.
有时gcc使用32位寄存器,当我希望它使用64位寄存器时.例如以下C代码:
unsigned long long
div(unsigned long long a, unsigned long long b){
return a/b;
}
Run Code Online (Sandbox Code Playgroud)
使用-O2选项编译(省略一些样板文件):
div:
movq %rdi, %rax
xorl %edx, %edx
divq %rsi
ret
Run Code Online (Sandbox Code Playgroud)
对于无符号除法,寄存器%rdx
需要0
.这可以通过xorq %rdx, %rdx
但xorl %edx, %edx
似乎具有相同的效果来实现.
至少在我的机器上没有性能提升(即加速)进行xorl
了xorq
.
我实际上不只是一个问题:
xorl
并且不使用xorw
?xorl
比这更快的机器xorq
?