这与此问题有关,但不一样:x86-64汇编的性能优化 - 对齐和分支预测与我之前的问题略有关系:无符号64位到双倍转换:为什么这个算法来自g ++
以下是一个不真实的测试用例.这种素性测试算法是不明智的.我怀疑任何真实世界的算法都不会执行如此多的小内循环(num大概是2**50的大小).在C++ 11中:
using nt = unsigned long long;
bool is_prime_float(nt num)
{
for (nt n=2; n<=sqrt(num); ++n) {
if ( (num%n)==0 ) { return false; }
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
然后g++ -std=c++11 -O3 -S生成以下内容,包含RCX n和包含XMM6 sqrt(num).请参阅我之前发布的剩余代码(在此示例中从未执行过,因为RCX永远不会变得足够大,不能被视为带符号的否定).
jmp .L20
.p2align 4,,10
.L37:
pxor %xmm0, %xmm0
cvtsi2sdq %rcx, %xmm0
ucomisd %xmm0, %xmm6
jb .L36 // Exit the loop
.L20:
xorl %edx, %edx
movq %rbx, %rax …Run Code Online (Sandbox Code Playgroud) 如果我编译,使用g ++ 4.9.2
bool int_dbl_com(const unsigned long long x, const double y)
{
return x <= y;
}
Run Code Online (Sandbox Code Playgroud)
那么汇编程序输出(对于Windows x64调用约定)是:
testq %rcx, %rcx # x in RCX
js .L2
pxor %xmm0, %xmm0
cvtsi2sdq %rcx, %xmm0
ucomisd %xmm0, %xmm1 # y in XMM1
setae %al
ret
Run Code Online (Sandbox Code Playgroud)
该命令cvtsi2sdq是签名转换,第一个测试和跳转组合是检查是否%rcx < 0.如果是这样,我们去L2,我不明白:
.L2:
movq %rcx, %rax
andl $1, %ecx
pxor %xmm0, %xmm0
shrq %rax
orq %rcx, %rax
cvtsi2sdq %rax, %xmm0
addsd %xmm0, %xmm0
ucomisd %xmm0, %xmm1
setae %al …Run Code Online (Sandbox Code Playgroud) 我有一个非常基本的Python包示例和我正在尝试使用pytest运行的测试
package
\--
__init__.py
spam.py
spam_test.py
Run Code Online (Sandbox Code Playgroud)
__init__.py为空,spam.py定义单个函数func(),spam_test.py并且:
import package.spam
def test_func():
assert(package.spam.func() == 5)
Run Code Online (Sandbox Code Playgroud)
在我运行的根目录中py.test,一切正常,返回一个通过测试.
我以为我也可以用这种方式构建东西:
package
\--
__init__.py
spam.py
tests
\--
spam_test.py
Run Code Online (Sandbox Code Playgroud)
但现在当我py.test在根中运行时,我得到:
============================= test session starts ============================= platform win32 -- Python 3.6.0, pytest-3.0.5, py-1.4.32, pluggy-0.4.0 rootdir: C:\Users\MattUser\Documents\m_drive\notebooks\testing, inifile: collected 0 items / 1 errors =================================== ERRORS ==================================== _____________________ ERROR collecting tests/spam_test.py _____________________ ImportError while importing test module 'C:\Users\MattUser\Documents\m_drive\not ebooks\testing\tests\spam_test.py'. Hint: make sure your test modules/packages …
这是一个有点模糊的问题,但是在浪费了一个小时追踪这个bug后,我觉得值得一提......
我写了一个自定义的订单struct,并犯了一个错误:
CompareTo方法犯了一个错误:只要是"min" a.CompareTo(b)就会返回,但当然如果也是"min"它应该返回0.-1ab现在,这个错误完全弄乱了一个List<MyStruct> Sort()方法:整个列表(有时)会以随机顺序出现.
使用LINQ OrderBy方法可能会导致无限循环...
小巧,完整,测试示例:
struct MyStruct : IComparable<MyStruct>
{
public int State;
public MyStruct(int s) { State = s; }
public int CompareTo(MyStruct rhs)
{
// 10 is the "min" state. Otherwise order as usual
if (State == 10) { return -1; } // Incorrect
/*if (State == 10) // Correct version
{
if (rhs.State == 10) { …Run Code Online (Sandbox Code Playgroud) 我似乎tkinter通过使用一些多线程来破坏linux。据我所知,我设法在不是主 GUI 线程的线程上触发垃圾回收。这导致__del__在一个tk.StringVar实例上运行,该实例试图tcl从错误的线程调用堆栈,从而导致 linux 上的混乱。
下面的代码是我能想出的最小例子。请注意,我没有用 做任何实际工作matplotlib,但否则我无法触发问题。在__del__对方法Widget验证的Widget情况下被从其他线程删除。典型的输出是:
Running off thread on 140653207140096
Being deleted... <__main__.Widget object .!widget2> 140653210118576
Thread is 140653207140096
... (omitted stack from from `matplotlib`
File "/nfs/see-fs-02_users/matmdpd/anaconda3/lib/python3.6/site-packages/matplotlib/text.py", line 218, in __init__
elif is_string_like(fontproperties):
File "/nfs/see-fs-02_users/matmdpd/anaconda3/lib/python3.6/site-packages/matplotlib/cbook.py", line 693, in is_string_like
obj + ''
File "tk_threading.py", line 27, in __del__
traceback.print_stack()
...
Exception ignored in: <bound method Variable.__del__ of <tkinter.StringVar object at 0x7fec60a02ac8>>
Traceback …Run Code Online (Sandbox Code Playgroud) 我有一个Treeviewin tkinter(Linux 上的 Python 3.6,但 Windows 上也发生同样的情况),我用它来模拟一种电子表格布局。我的问题是,如果我运行下面的示例代码,并调整“第 1 列”的大小,那么随着“第 1 列”变大,“第 2 列”变小。但是,如果我将最后一列拖到右侧,滚动条就会展开,现在我可以调整第 1 列的大小而不更改第 2 列的大小(而是整个树视图展开)。如果您随后再次调整第 1 列的大小,直到所有列都适合视图,则行为似乎会恢复为原始状态。
是什么导致了这种行为的改变?两者,我怎样才能阻止它,以及如何确保它是默认的?
最小工作示例:
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
tree = ttk.Treeview(root)
tree["show"] = "headings"
tree["columns"] = list(range(3))
for i in range(3):
tree.heading(i, text="Column {}".format(i))
for i in range(5):
tree.insert('', "end", i)
tree.grid(row=0, column=0, sticky=(tk.N, tk.S, tk.E, tk.W))
xs = ttk.Scrollbar(root, orient=tk.HORIZONTAL, command=tree.xview)
tree["xscrollcommand"] = xs.set
xs.grid(row=1, column=0, …Run Code Online (Sandbox Code Playgroud) python-3.x ×3
assembly ×2
tkinter ×2
c# ×1
g++ ×1
intel ×1
list ×1
matplotlib ×1
performance ×1
pytest ×1
python ×1
x86 ×1
x86-64 ×1