警告杀了我的表现 [英] Warnings killing my performance
问题描述
我有以下代码:
def IntToRandFloat(x):
"""给定一个32位整数,返回一个漂浮在[-1.0,1.0]"""
x = int(x)
x = int(x << 13)^ x >
返回(1.0 - ((x *(x * x * 15731 + 789221)+1376312589)& 0x7fffffff)/1073741824.0)
基本上它是从a直接复制的函数C实现。现在
看起来左移的行导致丢失的比特
或改变符号将在Python 2.4及更高版本中返回长。警告。所有
好又好 - 我明确地将它强制转换为int,以便在升级Python时代码
不会中断。我也使用
warnings.filterwarnings(action =''忽略''等)禁用警告。
然而,当我需要配置我的应用程序时,我看到这样的行:
11266617函数调用488.717 CPU秒
ncalls tottime percall cumtime percall
文件名:lineno (功能)
3145728 129.744 0.000 364.845 0.000
terraingen.py:22(IntToRandFloat)
3142872 150.484 0.000 235.101 0.000 warnings.py:24 (警告)
3142872 84.617 0.000 84.617 0.000
warnings.py:59(warn_explicit)
现在我显然可以''我的节目时间几乎有一半
警告消耗我不想看。
它变得陌生。如果我将换档线更改为:
x = int(x *(2 ** 13))^ x
x = int(x | 0xFFFF)
....每次调用IntToRandFloat
时,它仍在调用''warn'',但我看到没有警告,即使我不知道不要导入警告
并禁用任何警告。我没有其他进口(我可以看到)可能
在幕后禁用警告。
所以我遇到这些问题:警告很慢(即使在禁用的情况下),
有时会发出警告而且我从未看到它们,并且给了
我从未看到警告我不知道如何获得围绕他们。
所以,我的第一个问题是询问是否有一种更有效的方式来禁用警告?
我的第二个是,有一个快速的方法取一个整数,转移
它留下13位(或乘以2 ** 13,无论如何),丢弃任何
多余的位,哪些不会引起警告?
最后,一个建议;如果由于这种转换操作2.4将自动推广到
a,标准库
将为我们这些人提供有损移位运算符的C实现
会从快速版本中受益吗?我猜这很长时间来推广
然后让它回到正常的int并不是最快的操作。
/ >
-
Ben Sizer
Ben>所以我有这些问题:警告很慢(即使在禁用时),
Ben>有时会发出警告,我从来没有看过它们,并给出了
Ben>我从来没有看到警告,我不知道如何绕过它们。
Ben>所以,我的第一个问题是询问是否有更有效的方式
Ben>禁用警告?
这可能看起来很愚蠢,但切换到Python的CVS版本(又名2.4a0)
应该会有很大的帮助,因为它已经消失了:
%python2.3~ / local / bin / timeit.py -s''import sys; sys.path.append(QUOT; /用户/跳过/ TMP");来自警告导入IntToRandFloat''''IntToRandFloat(789221)''
/Users/skip/tmp/warn.py:4:FutureWarning:x<< y丢失位或更改符号将返回很长的Python 2.4及以上
x = int(x << 13)^ x
10000循环,最佳3:114每循环usec
%python2.4~ / local / bin / timeit.py -s''import sys; sys.path.append(QUOT; /用户/跳过/ TMP");来自warn import IntToRandFloat''''IntToRandFloat(789221)''
100000循环,最佳3:16.7 usec每循环
Ben>最后,一个建议;如果2.4将引入自动促销
Ben>由于这种转变操作,很长一段时间将标准
Ben>库提供有损移位运算符的C实现
Ben>那些受益于快速版本的我们?我在猜测
Ben>将它推广到很长时间然后让它恢复正常
Ben> int并不是最快的操作。
显然它比导航所有警告
机器要快得多。 ;-)
Skip
''或''in in'x = int(x | 0xFFFF)"在任何人选择指出它之前,显然意味着是''和'',
。 :)
-
Kylotan
" Kylotan" < KY ***** @ hotmail.com>在消息中写道
news:15 ************************* @ posting.google.co m ... < blockquote class =post_quotes>我的第二个是,有一个快速的方法取一个整数,移位它留下13位(或乘以2 ** 13,无论如何),丢弃任何多余的比特,哪个不会引起警告?
您是否尝试在转换之前屏蔽高13位*?那么
没有溢出警告?这有什么意义吗?
TJR
I have the following code:
def IntToRandFloat(x):
"""Given a 32-bit integer, return a float in [-1.0, 1.0]"""
x = int(x)
x = int(x << 13) ^ x
return (1.0-((x*(x*x*15731+789221)+1376312589)&0x7fffffff)/1073741824.0)
Basically it''s a function directly copied from a C implementation. Now
it appears that the line with the left-shift causes the "losing bits
or changing sign will return a long in Python 2.4 and up" warning. All
well and good - I explicitly cast it back to an int so that the code
won''t break when I upgrade Python. I also disable the warning using
warnings.filterwarnings(action = ''ignore'', etc).
However when the time comes to profile my app, I see lines like these:
11266617 function calls in 488.717 CPU seconds
ncalls tottime percall cumtime percall
filename:lineno(function)
3145728 129.744 0.000 364.845 0.000
terraingen.py:22(IntToRandFloat)
3142872 150.484 0.000 235.101 0.000 warnings.py:24(warn)
3142872 84.617 0.000 84.617 0.000
warnings.py:59(warn_explicit)
Now I obviously can''t afford to have almost half my program time
consumed by warnings that I don''t want to see.
It gets stranger. If I change the shift line to this:
x = int(x * (2 ** 13)) ^ x
x = int(x | 0xFFFF)
....it''s still calling ''warn'' once for each time IntToRandFloat is
called, but I see no warning appear, even when I don''t import warnings
and disable any. I have no other imports (that i can see) which might
be disabling a warning behind the scenes.
So I have these problems: warnings are slow (even when disabled),
sometimes warnings are being issued and I never see them, and given
that I never see the warnings I don''t know how to get around them.
So, my first question is to ask if there is a more efficient way of
disabling warnings?
And my second is, is there a quick way of taking an integer, shifting
it left 13 bits (or multiplying by 2 ** 13, whatever), discarding any
excess bits, and which won''t cause a warning?
Lastly, a suggestion; if 2.4 will introduce an automatic promotion to
a long as a result of this shift operation, will the standard library
provide a C implementation of the lossy shift operator for those of us
that would benefit from a quick version? I''m guessing that promoting
it to a long and then getting it back to a normal int is not exactly
the speediest operation.
--
Ben Sizer
Ben> So I have these problems: warnings are slow (even when disabled),
Ben> sometimes warnings are being issued and I never see them, and given
Ben> that I never see the warnings I don''t know how to get around them.
Ben> So, my first question is to ask if there is a more efficient way of
Ben> disabling warnings?
This may seem silly, but switching to the CVS version of Python (aka 2.4a0)
should help immensely, simply because that is gone:
% python2.3 ~/local/bin/timeit.py -s ''import sys ; sys.path.append("/Users/skip/tmp"); from warn import IntToRandFloat'' ''IntToRandFloat(789221)''
/Users/skip/tmp/warn.py:4: FutureWarning: x<<y losing bits or changing sign will return a long in Python 2.4 and up
x = int(x << 13) ^ x
10000 loops, best of 3: 114 usec per loop
% python2.4 ~/local/bin/timeit.py -s ''import sys ; sys.path.append("/Users/skip/tmp"); from warn import IntToRandFloat'' ''IntToRandFloat(789221)''
100000 loops, best of 3: 16.7 usec per loop
Ben> Lastly, a suggestion; if 2.4 will introduce an automatic promotion
Ben> to a long as a result of this shift operation, will the standard
Ben> library provide a C implementation of the lossy shift operator for
Ben> those of us that would benefit from a quick version? I''m guessing
Ben> that promoting it to a long and then getting it back to a normal
Ben> int is not exactly the speediest operation.
Apparently it''s quite a bit faster than navigating all the warning
machinery. ;-)
Skip
The ''or'' in "x = int(x | 0xFFFF)" was obviously meant to be an ''and'',
before anybody chooses to point it out. :)
--
Kylotan
"Kylotan" <ky*****@hotmail.com> wrote in message
news:15*************************@posting.google.co m...And my second is, is there a quick way of taking an integer, shifting
it left 13 bits (or multiplying by 2 ** 13, whatever), discarding any
excess bits, and which won''t cause a warning?
Have you tried masking off the upper 13 bits *before* the shift? So that
there is no overflow to warn about? Does this make any sense?
TJR
这篇关于警告杀了我的表现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!