我想Cython通过使用将一些额外的选项传递给编译器extra_compile_args.
我的setup.py:
from distutils.core import setup
from Cython.Build import cythonize
setup(
name = 'Test app',
ext_modules = cythonize("test.pyx", language="c++", extra_compile_args=["-O3"]),
)
Run Code Online (Sandbox Code Playgroud)
但是,当我跑步时python setup.py build_ext --inplace,我收到以下警告:
UserWarning: got unknown compilation option, please remove: extra_compile_args
Run Code Online (Sandbox Code Playgroud)
问题:如何extra_compile_args正确使用?
我用Cython 0.23.4下了Ubuntu 14.04.3.
我需要使用大数字(在1E100 - 1E200范围内).但是,BigInteger该类似乎通常是合适的,在初始化期间不识别科学格式的字符串,也不支持转换为格式的字符串.
BigDecimal d = new BigDecimal("1E10"); //works
BigInteger i1 = new BigInteger("10000000000"); //works
BigInteger i2 = new BigInteger("1E10"); //throws NumberFormatException
System.out.println(d.toEngineeringString()); //works
System.out.println(i1.toEngineeringString()); //method is undefined
Run Code Online (Sandbox Code Playgroud)
有办法吗?我无法想象这样的类的设计是假设用户必须输入数百个零.
我有一个my.df以下结构的数据框:
A B C
1 1 1 2
2 2 3 4
3 3 5 6
4 NA 7 8
5 NA 9 NA
Run Code Online (Sandbox Code Playgroud)
如何使用x轴上的列名和y上的所有值构建一个箱形图?
有很多答案,如:
ggplot(melt(my.df), aes(variable, value)) + geom_boxplot()
Run Code Online (Sandbox Code Playgroud)
但我不明白,我实际应该传递的是"变量"和"价值".我尝试了x=colnames(my.df)),这部分有效,但我仍然不知道如何处理y.
我有一个numpy带有一些NaN值的数组:
>>> a
array([ 1., -1., nan, 0., nan], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
我可以按升序或'降序'排序:
>>> numpy.sort(a)
array([ -1., 0., 1., nan, nan], dtype=float32)
>>> numpy.sort(a)[::-1]
array([ nan, nan, 1., 0., -1.], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
但是,我想要的是降序,最后是NaN值,如下所示:
>>> numpy.genuine_reverse_sort(a)
array([ 1., 0., -1., nan, nan], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
怎么可以实现呢?我怀疑没有特别的方法.
我使用MPI(mpi4py)脚本(在单个节点上),该脚本可用于非常大的对象。为了让所有进程都可以访问该对象,我通过分发了该对象comm.bcast()。这会将对象复制到所有进程,并占用大量内存,尤其是在复制过程中。因此,我想共享诸如指针之类的东西,而不是对象本身。我发现一些memoryview有用的功能有助于增强流程中对象的工作。同样,对象的实际内存地址也可以通过memoryview对象字符串表示形式进行访问,并且可以这样分配:
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
if rank:
content_pointer = comm.bcast(root = 0)
print(rank, content_pointer)
else:
content = ''.join(['a' for i in range(100000000)]).encode()
mv = memoryview(content)
print(mv)
comm.bcast(str(mv).split()[-1][: -1], root = 0)
Run Code Online (Sandbox Code Playgroud)
打印:
<memory at 0x7f362a405048>
1 0x7f362a405048
2 0x7f362a405048
...
Run Code Online (Sandbox Code Playgroud)
这就是为什么我认为必须有一种方法可以在另一个过程中重构对象。但是,我在文档中找不到有关如何执行此操作的线索。
简而言之,我的问题是:是否可以在中同一节点上的进程之间共享对象mpi4py?
模块numpy是一个出色的工具,可以高效地存储python对象,其中包括字符串.对于numpy数组中的ANSI字符串,每个字符仅使用1个字节.
但是,有一个不便之处.存储对象的类型不多string但是bytes,这意味着在大多数情况下必须进行解码以便进一步使用,这反过来意味着相当庞大的代码:
>>> import numpy
>>> my_array = numpy.array(['apple', 'pear'], dtype = 'S5')
>>> print("Mary has an {} and a {}".format(my_array[0], my_array[1]))
Mary has an b'apple' and a b'pear'
>>> print("Mary has an {} and a {}".format(my_array[0].decode('utf-8'),
... my_array[1].decode('utf-8')))
Mary has an apple and a pear
Run Code Online (Sandbox Code Playgroud)
使用其他数据类型可以消除这种不便,例如:
>>> my_array = numpy.array(['apple', 'pear'], dtype = 'U5')
>>> print("Mary has an {} and a {}".format(my_array[0], my_array[1]))
Mary has an apple and a pear
Run Code Online (Sandbox Code Playgroud)
但是,这只能通过内存使用量增加4倍来实现:
>>> numpy.info(my_array)
class: ndarray …Run Code Online (Sandbox Code Playgroud) 我想分割一个包含不规则重复分隔符的字符串,就像方法split()一样:
>>> ' a b c de '.split()
['a', 'b', 'c', 'de']
Run Code Online (Sandbox Code Playgroud)
但是,当我通过正则表达式应用 split 时,结果是不同的(空字符串潜入结果列表):
>>> re.split('\s+', ' a b c de ')
['', 'a', 'b', 'c', 'de', '']
>>> re.split('\.+', '.a.b...c..de..')
['', 'a', 'b', 'c', 'de', '']
Run Code Online (Sandbox Code Playgroud)
我想看到的:
>>>some_smart_split_method('.a.b...c..de..')
['a', 'b', 'c', 'de']
Run Code Online (Sandbox Code Playgroud) 我有两个版本的Hello World程序:
#include <iostream>
int main() {
std::cout<<"Hello World";
}
Run Code Online (Sandbox Code Playgroud)
和
#include <iostream>
int main() {
std::cout<<"Hello World and a very long message";
}
Run Code Online (Sandbox Code Playgroud)
如果执行严格的大小优化,我期望这些二进制文件的大小不同.但是,当我用g++ -Os -o test test.cpp -Wl,--strip-all(with GCC 5.4.0)编译时,我得到相同的文件大小(在我的系统上是6336,这是Ubuntu).这意味着有一些垃圾空间用于一些最小尺寸的缓冲区(尽管在这个例子中我希望字符串是const char[]).
我的问题:这个缓冲区的本质是什么以及如何从生成的二进制文件中删除垃圾字符?
从教程我读到:
对同一对象的两个同步方法的调用不可能进行交错.当一个线程正在为对象执行同步方法时,所有其他线程调用同一对象的同步方法(暂停执行)直到第一个线程完成对象.
但是,在我的简单示例中,仍然存在用于访问message对象的竞赛.
public class TestThread extends Thread{
int thread;
StringBuilder message;
public TestThread(int thread, StringBuilder message) {
this.thread=thread;
this.message=message;
start();
}
public void run() {
synchronized(this){
for (int i=0; i<1000000; i++) {
double a=2*2;
}
modifyMessage();
}
}
public synchronized void modifyMessage() {
message.append(thread);
}
}
public class TestMultithreading {
static TestThread[] testThreads = new TestThread[5];
public static void main(String args[]) {
StringBuilder message = new StringBuilder("A");
for (int i=0;i<5;i++)
testThreads[i] = new TestThread(i, message); …Run Code Online (Sandbox Code Playgroud) 我有以下Cython代码:
from cython import parallel
from libc.stdio cimport printf
def test_func():
cdef int thread_id = -1
with nogil, parallel.parallel(num_threads=10):
thread_id = parallel.threadid()
printf("Thread ID: %d\n", thread_id)
Run Code Online (Sandbox Code Playgroud)
但是,它始终只启动一个线程,即始终只输出
Thread ID: 0
Run Code Online (Sandbox Code Playgroud)
我在做多线程时做错了什么?
python ×4
cython ×2
java ×2
numpy ×2
python-3.x ×2
arrays ×1
biginteger ×1
c++ ×1
ggplot2 ×1
memoryview ×1
mpi ×1
mpi4py ×1
openmp ×1
optimization ×1
r ×1
regex ×1
string ×1