我使用itertools.product生成长度为13的4个元素的所有可能变体.4和13可以是任意的,但实际上,我得到4 ^ 13个结果,这是很多.我需要将结果作为Numpy数组,目前执行以下操作:
c = it.product([1,-1,np.complex(0,1), np.complex(0,-1)], repeat=length)
sendbuf = np.array(list(c))
Run Code Online (Sandbox Code Playgroud)
有一些简单的分析代码介于两者之间,看起来第一行几乎是瞬时的,而转换为列表然后Numpy数组需要大约3个小时.有没有办法让这更快?这可能是我忽视的非常明显的事情.
谢谢!
我在几个for循环中多次使用numpy的函数,但它变得太慢了.有没有办法更快地执行此功能?我读过你应该尝试在线循环,以及在for循环之前为函数创建局部变量,但似乎没有什么能提高速度(<1%).在len(UNIQ_IDS)〜800 emiss_data和obj_data有numpy的ndarrays具有形状=(2600,5200).我用import profile得到的瓶颈在哪里手柄,并且where在for循环是一个大的.
import numpy as np
max = np.max
where = np.where
MAX_EMISS = [max(emiss_data[where(obj_data == i)]) for i in UNIQ_IDS)]
Run Code Online (Sandbox Code Playgroud) 将数据存储在内存中所需的RAM与将相同数据存储在文件中所需的磁盘空间相比如何?或者没有广义相关性?
例如,假设我只有十亿个浮点值.以二进制形式存储,磁盘上有40亿字节或3.7GB(不包括标题等).然后说我把这些值读入Python的列表中......我应该要求多少RAM?
有没有办法在python中缩写比较语句,这样我就不必再把整个事情写出去了?例如,而不是:
a=3
if a==3 or a==2:
print "hello world"
Run Code Online (Sandbox Code Playgroud)
我可以这样做:如果a ==(3或2):打印"你好世界"
我知道上面的例子不起作用但是有另一种方法可以达到预期的效果吗?
我试图通过在Cython中实现它来优化Python算法.我的问题是关于以下代码中存在的某个性能瓶颈:
@cython.boundscheck(False) # turn off bounds-checking for entire function
def anglesToRGB( np.ndarray[double, ndim=2] y, np.ndarray[double, ndim=2] x ):
cdef double angle
cdef double Hp
cdef double C
cdef double X
cdef np.ndarray[double, ndim=3] res = np.zeros([y.shape[0], y.shape[1], 3], dtype=np.float64)
for i in xrange(y.shape[0]):
for j in xrange(y.shape[1]):
angle = atan2( y[i,j], x[i,j] )*180.0/PI+180
C = sqrt(pow(y[i,j],2)+pow(x[i,j],2))/360.0 #Chroma
Hp = angle/60.0
X = C*(1-fabs( Hp%2-1))
C *= 255
X *= 255
if (0. <= Hp < 1.):
res[i,j,:] = [C,X,0]
elif …Run Code Online (Sandbox Code Playgroud) 您可以__slots__使用列表或元组(或任何可迭代的?)在新型python类中进行定义。创建实例后,该类型仍然存在。
鉴于元组总是比列表更有效率并且是不变的,是否有任何理由不希望使用元组__slots__呢?
>>> class foo(object):
... __slots__ = ('a',)
...
>>> class foo2(object):
... __slots__ = ['a']
...
>>> foo().__slots__
('a',)
>>> foo2().__slots__
['a']
Run Code Online (Sandbox Code Playgroud) 假设我有需要迭代的组件,例如"From"和"To".为方便起见,我可以遍历这些字符串,但我不需要将它们存储任何延长的时间段,因为我只需要执行一次.在这种情况下使用列表或元组会更好吗?
info = {}
for type in ('from', 'to'):
info[type] = fetch(type);
Run Code Online (Sandbox Code Playgroud)
请注意,如果将元组更改为列表,则上述操作将完全相同; 我想知道是否有一些偏好.
我正在阅读O'Reilly 出版的 Luciano Ramalho所著的Fluent Python一书。在第二章中,作者提出了一个定义容器序列和平面序列的有趣语句。
容器序列:list、tuple 和 collections.deque 可以容纳不同类型的项目。
平面序列:str、bytes、bytearray、memoryview 和 array.array 保存一种类型的项目。
然后他继续说:-
容器序列保存对它们包含的对象的引用,这些对象可以是任何类型,而平面序列物理地将每个项目的值存储在其自己的内存空间中,而不是作为不同的对象。因此,平面序列更紧凑,但它们仅限于保存原始值,如字符、字节和数字。*
这让我想到,如果列表存储对它们正在存储的对象的引用,那么像数组这样的平面序列以什么方式存储其元素的值?作者说扁平序列物理存储了每个项目的价值。他是什么意思?
这是我第一次提问。请原谅我在这方面缺乏知识。
我想知道如何在 python 中使用一个 if 语句,该语句将对 5 个条件中的任何 3 个条件为真做出反应,以使 if 语句为真。
if (a>2) and (b>3) and (c>2) and (d>6) and (e>4):
list.append(True)
Run Code Online (Sandbox Code Playgroud)
如果满足所有 5 个条件,此代码会将 true 添加到数组“列表”,但我想知道如果 5 个条件中的任何 3 个为 true,然后将 true 附加到“列表”,如何让它工作?