我是Cython和C++的菜鸟,所以我对论证传递有一个问题.我想避免在以下场景中传递参数的副本:
# somefile.pyx
#distutils: language = c++
from libcpp.vector cimport vector
def add_one(vector[int] vect):
cdef int i
n = vect.size()
for i in range(n):
vect[i] += 1
cdef vector[int] v
for i in range(100000):
v.push_back(i)
add_one(v) # <-- ??
Run Code Online (Sandbox Code Playgroud)
我希望该方法add_one
只是修改v
"就地".我相信在C++中,你可以通过预先挂起参数来实现这一点&
,这意味着对指针的任何更改都会传递给指针.这样,您不必担心传递指针或实际对象,即
add_one(v); # in c++
Run Code Online (Sandbox Code Playgroud)
我可以在Cython中做同样的事情,还是我必须明确地将arg类型更改为引用,即def add_one(vector[int]* vect)
?
在性能方面(代数运算,查找,缓存等),C数组(可以作为C数组公开,或者cython.view.array
[Cython数组],或上述两者的内存视图)和NumPy数组(在Cython中应该没有Python开销)
编辑:
我应该提一下,在NumPy数组中使用Cython进行静态类型化,dtype
s是NumPy编译时数据类型(例如cdef np.int_t
或者cdef np.float32_t
),C语言中的类型是C等价物(cdef int_t
和cdef float
)
EDIT2:
以下是Cython Memoryview文档中的示例,以进一步说明我的问题:
from cython.view cimport array as cvarray
import numpy as np
# Memoryview on a NumPy array
narr = np.arange(27, dtype=np.dtype("i")).reshape((3, 3, 3))
cdef int [:, :, :] narr_view = narr
# Memoryview on a C array
cdef int carr[3][3][3]
cdef int [:, :, :] carr_view = carr
# Memoryview on a Cython …
Run Code Online (Sandbox Code Playgroud) 一旦Kubernetes集群已经运行,您如何找到它的集群/服务CIDR?
我知道Minikube,它是10.0.0.1/24.
对于GKE,你可以找到通过
gcloud container clusters describe XXXXXXX --zone=XXXXXX |
grep -e clusterIpv4Cidr -e servicesIpv4Cidr
Run Code Online (Sandbox Code Playgroud)
但是,你如何找到一个通用的Kubernetes集群,特别是通过kubectl
?
我在多类设置中看到了关于类不平衡的几个问题.但是,我有一个多标签问题,所以在这种情况下你会怎么处理?
我有一组约300k文本示例.如标题中所述,每个示例至少有一个标签,并且只有100个可能的唯一标签.我已经通过利用命名空间将这个问题简化为Vowpal Wabbit的二进制分类,例如
从:
healthy fruit | bananas oranges jack fruit
evil monkey | bipedal organism family guy
...
Run Code Online (Sandbox Code Playgroud)
至:
1 |healthy bananas oranges jack fruit
1 |fruit bananas oranges jack fruit
0 |evil bananas oranges jack fruit
0 |monkey bananas oranges jack fruit
0 |healthy bipedal organism family guy
0 |fruit bipedal organism family guy
1 |evil bipedal organism family guy
1 |monkey bipedal organism family guy
...
Run Code Online (Sandbox Code Playgroud)
我正在使用大众提供的默认选项(我认为是在线SGD,具有平方损失功能).我正在使用平方损失,因为它非常类似汉明损失.
在训练之后,当我在相同的训练集上进行测试时,我注意到所有的例子都是用'0'标签预测的 ......这是一种最小化损失的方法,我想.在这一点上,我不知道该怎么做.我正在考虑使用成本敏感的一对一分类来尝试平衡类,但是由于存在2 ^ 100个标签组合,因此将多标签减少到多类是不可行的.我想知道是否有其他人有任何建议.
编辑:我终于有机会测试类失衡,特别是vw …
classification machine-learning vowpalwabbit text-classification
我正在通过IPython Notebook测试NumPy的memmap,代码如下
Ymap = np.memmap('Y.dat', dtype='float32', mode='w+', shape=(5e6, 4e4))
Run Code Online (Sandbox Code Playgroud)
如你所见,它Ymap
的形状非常大.我试图Ymap
像稀疏矩阵一样填满.我没有使用scipy.sparse
矩阵,因为我最终需要用另一个密集矩阵对它进行点积,这绝对不适合内存.
无论如何,我正在执行一系列很长的索引操作:
Ymap = np.memmap('Y.dat', dtype='float32', mode='w+', shape=(5e6, 4e4))
with open("somefile.txt", 'rb') as somefile:
for i in xrange(5e6):
# Read a line
line = somefile.readline()
# For each token in the line, lookup its j value
# Assign the value 1.0 to Ymap[i,j]
for token in line.split():
j = some_dictionary[token]
Ymap[i,j] = 1.0
Run Code Online (Sandbox Code Playgroud)
这些操作不知何故很快耗尽了我的RAM.我认为mem-mapping基本上是一个核心内容numpy.ndarray
.我错了吗?为什么我的记忆力如此疯狂?
Vowpal Wabbit会在每个纪元/通过后自动调整其数据吗?我希望创建的缓存文件将包含在线算法(如VW的默认在线SGD方法)所必需的混洗元数据.例如
vw -d train.txt -c --passes 50 -f train.model
Run Code Online (Sandbox Code Playgroud)
如果没有,我有一个备份脚本,可以在每次传递时手动调整数据
# Create the initial regressor file
vw -d train.txt -f train.model
# For the next 49 passes, shuffle and then update the regressor file
for i in {0..49}
do
<some script: train.txt --> shuffled_data.txt>
vw -d shuffled_data.txt -i train.model -f train.model
done
Run Code Online (Sandbox Code Playgroud)
如果VW没有自动洗牌,那么是否有更有效的方法来执行上述代码块?不幸的是,VW的wiki对此并不清楚.谢谢.
在CIFAR-10教程中,我注意到变量放在CPU内存中,但是它表示cifar10-train.py
它是用单个GPU训练的.
我很困惑..存储在GPU中的图层/激活是什么?或者,是否存储在GPU中的渐变?否则,似乎在CPU上存储变量根本不会使用GPU - 所有内容都存储在CPU内存中,因此只有CPU用于前向/后向传播.
如果GPU用于f/b传播,那么由于数据CPU < - > GPU的延迟洗牌,这不是浪费吗?
我试图减少python dict的内存消耗,在我的情况下,它作为word-->document_id
"倒排索引".每个word
都作为整数进行哈希处理,占用24个字节.
我想知道我是否可以将每个元素dict
的值和每个键转换dict
为一个bitarray.我注意到任何遇到的最大值int
都小于2^22
,所以我可以只分配一个"22号"的位数组.
如何才能做到这一点?到目前为止,我已经看过gmpy2
和bitarray
库,以及std::bitset
C++ stdlib,我可以使用Cython.我从这篇文章中读到的bitarray
并不是那么快gmpy
.在gmpy
,我不知道如何设置大小.最后,我想知道Python中的内存开销gmpy
或bitarray
对象是否值得,当我可以使用时std::bitset
,它可能使用最少的内存.
在libuv
文件heap-inl.h中,我看到以下宏
#if defined(__GNUC__)
# define HEAP_EXPORT(declaration) __attribute__((unused)) static declaration
...
HEAP_EXPORT(void heap_init(struct heap* heap));
...
Run Code Online (Sandbox Code Playgroud)
heap-inl.h
包含在loop.c
使用声明函数的源文件中heap_init
。
根据我的解释...
heap-inl.h
代表堆“ inline”?HEAP_EXPORT
正在导出要由其他源文件使用的功能。我不明白的是为什么标记了导出功能__attribute((unused))__
。另外,为什么还要static
声明?我认为static
函数只能在其定义的文件中使用。此外,内联函数与这一切有什么关系?
我正在将文件的每一行读入列表和字典,
with open("../data/title/pruned2_titleonly.txt", 'rb') as f_titles:
titles_lst = f_titles.read().split('\n')
assert titles_lst[-1] == ''
titles_lst.pop() # remove the last element, an empty string
titles_dict = {}
with open("../data/title/pruned2_titleonly.txt", 'rb') as f_titles:
for i,line in enumerate(f_titles):
titles_dict[i] = line
Run Code Online (Sandbox Code Playgroud)
我正在通过以随机顺序访问list/dict中的每个项目来测试性能:
n = len(titles_lst)
a = np.random.permutation(n)
%%time
for i in xrange(10):
t = []
for b in a:
t.append(titles_lst[b])
del t
>>> CPU times: user 18.2 s, sys: 60 ms, total: 18.2 s
>>> Wall time: 18.1 s
%%time
for i in …
Run Code Online (Sandbox Code Playgroud) 两者之间有什么区别吗?
vector<int> function(vector<int>& input) {
// do something with input then return it
input.push_back(3);
return input;
}
Run Code Online (Sandbox Code Playgroud)
和
vector<int>& function(vector<int>& input) {
// do something with input then return it
input.push_back(3);
return input;
}
Run Code Online (Sandbox Code Playgroud)
有关系吗?因为当您将函数的返回值分配给新变量时,矢量会被复制:
vector<int>result = function(some_vector);
Run Code Online (Sandbox Code Playgroud) python ×5
c++ ×3
cython ×3
c ×2
numpy ×2
python-2.7 ×2
vowpalwabbit ×2
arrays ×1
bitarray ×1
bitset ×1
dictionary ×1
gcc ×1
gnu ×1
kubectl ×1
kubernetes ×1
libuv ×1
list ×1
reference ×1
tensorflow ×1