我知道我可以通过这样做在python dict中添加一个新的键/值
some_dict['absent_key'] = somevalue
Run Code Online (Sandbox Code Playgroud)
但我真的不了解内部工作.
我曾经认为字典表现得像C++地图.如果[]操作符不存在,则为给定键创建元素,然后返回对它的引用,以便可以在运算符的同一行中为其赋值=.
但是,C++中的这种行为的结果是,如果我们从映射中查询不存在的键的值,则会为该键创建该元素,并返回值类型的默认值而不是错误.在python中,这会抛出一个KeyError.
所以我不明白的是:如何,因为[]运算符必须=在python 之前进行评估(我认为?),它的行为会有所不同,这取决于结果是读取还是分配了一个值(它不应该在那里知道)表达式评价的要点)?
python评估表达式的顺序有区别吗?或者解释器只是更聪明,因为字典是一个硬编码类型,所以它更准确地知道它的行为,而std :: map是在'库'中,所以编译器可以假设更少?还是其他一些原因?
请在投票前仔细阅读此问题。我在这里的其他问题中找不到我的问题。
假设我有一个数组,
>>> import numpy as np
>>> array = np.linspace(1,4,4, dtype=np.int)
>>> array
array([1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)
我想要一个函数,将这个数组分割成所有可能的部分,这样,
没有分裂:
([1,2,3,4])
Run Code Online (Sandbox Code Playgroud)
分成2几部分:
([1], [2,3,4])
([1,2], [3,4])
([1,2,3] ,[4])
Run Code Online (Sandbox Code Playgroud)
分成3几部分:
([1], [2], [3,4])
([1,2]), [3], [4])
([1], [2,3], [4])
Run Code Online (Sandbox Code Playgroud)
分成len(array)几部分:
([1],[2],[3],[4])
Run Code Online (Sandbox Code Playgroud)
我知道有np.split(array, r),但它不会给出所有可能的拆分。例如np.split(array, 2)会给,
[array([0, 1]), array([2, 3])]
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,这不是我需要的。如何实现我的需求?
问:编写一个返回数组中第二大数字的算法
a = [1, 2, 3, 4, 5]
print(max([x for x in a if x != max(a)]))
>> 4
Run Code Online (Sandbox Code Playgroud)
我试图弄清楚这个算法是如何工作的,以及pythons内部魔术是否会使它像写一个线性算法一样高效,这个算法只是在列表上循环a一次并存储最高和第二高的值.
如我错了请纠正我:
呼吁max(a)将是O(n)
[x for x in a] 也是O(n)
python是否足够智能来缓存值,max(a)或者这是否意味着算法的列表理解部分是O(n ^ 2)?
然后最终max([listcomp])将是另一个O(n),但这只会在理解完成后运行一次,所以最终算法将是O(n ^ 2)?
内部是否有任何花哨的业务会缓存该max(a)值并导致该算法的运行速度比O(n ^ 2)快?
我想创建一个包含[0.000,1.000]范围内所有浮点数的数组,所有浮点数都是3位小数/ 4位精度.
例如
>>> np.arange(start=0.000, stop=1.001, decimals=3)
[0.000, 0.001, ..., 0.100, 0.101, ..., 0.900, ..., 0.999, 0.000]
Run Code Online (Sandbox Code Playgroud)
可以做一些与此相关的事情吗?
我知道 numba 会产生一些开销,并且在某些情况下(非密集计算)它变得比纯 python 慢。但我不知道在哪里划线。是否可以使用算法复杂度的顺序来找出位置?
例如在这段代码中添加两个比 5 更短的数组 (~O(n)) 纯 python 更快:
def sum_1(a,b):
result = 0.0
for i,j in zip(a,b):
result += (i+j)
return result
@numba.jit('float64[:](float64[:],float64[:])')
def sum_2(a,b):
result = 0.0
for i,j in zip(a,b):
result += (i+j)
return result
# try 100
a = np.linspace(1.0,2.0,5)
b = np.linspace(1.0,2.0,5)
print("pure python: ")
%timeit -o sum_1(a,b)
print("\n\n\n\npython + numba: ")
%timeit -o sum_2(a,b)
Run Code Online (Sandbox Code Playgroud)
UPDADE:我所寻找的是一个类似的指导方针喜欢这里:
“一般准则是为不同的数据大小和算法选择不同的目标。“cpu”目标适用于小数据大小(大约小于 1KB)和低计算强度的算法。它具有最少的开销。“ “并行”目标适用于中等数据大小(约小于 1MB)。线程会增加小延迟。“cuda”目标适用于大数据大小(约大于 1MB)和高计算强度算法。将内存传输到并且来自 GPU 的开销显着增加。”
在我的python代码中,我需要循环大约 2500 万次,我希望尽可能对其进行优化。循环内的操作非常简单。为了使代码高效,我使用了numba模块,这有很大帮助,但如果可能的话我想进一步优化代码。
这是一个完整的工作示例:
import numba as nb
import numpy as np
import time
#######create some synthetic data for illustration purpose##################
size=5000
eps = 0.2
theta_c = 0.4
temp = np.ones(size)
neighbour = np.random.randint(size, size=(size, 3))
coschi = np.random.random_sample((size))
theta = np.random.random_sample((size))*np.pi/2
pwr = np.cos(theta)
###################end of dummy data##########################
###################-----main loop------###############
@nb.jit(fastmath=True)
def func(theta, pwr, neighbour, coschi, temp):
for k in range(np.argmax(pwr), 5000*(pwr.size)):
n = k%pwr.size
if (np.abs(theta[n]-np.pi/2.)<np.abs(theta_c)):
adj = neighbour[n,1]
else:
adj = neighbour[n,0]
psi_diff …Run Code Online (Sandbox Code Playgroud) 我有一堂课__slots__:
class A:
__slots__ = ('foo',)
Run Code Online (Sandbox Code Playgroud)
如果我创建一个没有指定__slots__的子类,该子类将有一个__dict__:
class B(A):
pass
print('__dict__' in dir(B)) # True
Run Code Online (Sandbox Code Playgroud)
有什么办法可以防止B有一个__dict__而不必设置__slots__ = ()?
我遇到了super()以两种不同方式使用该方法的代码,我无法理解逻辑上的区别。
我现在正在学习pygame模块,我有一个任务来创建一个类,Ball它继承自模块Sprite的类pygame(如果我没记错的话)。
我遇到了这个代码:
import pygame
class Ball(pygame.sprite.Sprite):
def __init__(self, x, y):
super(Ball, self).__init__()
Run Code Online (Sandbox Code Playgroud)
我无法理解与以下内容的区别:
import pygame
class Ball(pygame.sprite.Sprite):
def __init__(self, x, y):
super(Ball, self).__init__()
Run Code Online (Sandbox Code Playgroud)
(方法论super())
这些代码块在逻辑上有什么区别?为什么我需要传递给super()方法参数?这些论据必须是什么?
这是我的数组:
import numpy as np
a = np.array([0, 5.0, 0, 5.0, 5.0])
Run Code Online (Sandbox Code Playgroud)
是否可以通过numpy.where某种方式x为所有a小于的值增加一个值l?
所以像这样:
a = a[np.where(a < 5).add(2.5)]
Run Code Online (Sandbox Code Playgroud)
应该返回:
array([2.5, 5.0, 2.5, 5.0, 5.0])
Run Code Online (Sandbox Code Playgroud) 我在预定义列表和查询字符串中有元素.我想检查query_str预定义列表中是否有任何值,如果是,请将它们作为单独的元素附加到新列表中.
predefined_lst = ['hello', 'goodbye', 'see you later']
query_str = 'hello | are you having a nice day? see you later |'
new_lst = []
Run Code Online (Sandbox Code Playgroud)
我有将字符串与列表中的值进行比较的语法,但是我无法将字符串中出现的值作为列表中的单个元素附加到新列表中.在上面的例子中,new_lst应该是new_lst = ['hello', 'see you later'].
我现在所拥有的只是在打印时产生True new_lst.
predefined_lst = ['hello', 'goodbye', 'see you later']
query_str = 'hello | are you having a nice day? see you later |'
new_lst = []
match = if any(string in query_str for string in predefined_lst)
new_lst.append(match)
print(new_lst)
Run Code Online (Sandbox Code Playgroud)