我正在尝试从Cocoa应用程序运行Python脚本.它在主线程上运行得很好,但是我希望它在后台运行,并发GCD队列.
我正在使用以下方法来设置运行Python脚本的管理器类:
- (BOOL)setupPythonEnvironment {
if (Py_IsInitialized()) return YES;
Py_SetProgramName("/usr/bin/python");
Py_Initialize();
NSString *scriptPath = [[NSBundle mainBundle] pathForResource:@"MyScript" ofType:@"py"];
FILE *mainFile = fopen([scriptPath UTF8String], "r");
return (PyRun_SimpleFile(mainFile, (char *)[[scriptPath lastPathComponent] UTF8String]) == 0);
}
Run Code Online (Sandbox Code Playgroud)
之后,使用manager类的共享单例实例从以下实例方法(重复)调用脚本:
- (id)runScriptWithArguments:(NSArray *)arguments {
return [NSClassFromString(@"MyScriptExecutor") runWithArguments:arguments];
}
Run Code Online (Sandbox Code Playgroud)
上面的Objective-C代码挂钩到以下Python代码:
from Foundation import *
def run_with_arguments(arguments):
# ...a long-running script
class MyScriptExecutor(NSObject):
@classmethod
def runWithArguments_(self, arguments):
return run_with_arguments(arguments)
Run Code Online (Sandbox Code Playgroud)
当我总是从主队列运行上述Objective-C方法时,这可以工作,但是当从任何其他队列运行时,脚本返回null.有人可以解释一下,如果我想要做的事情不被支持,是否有一个好的方法呢?
经常调用Python脚本并运行很长时间,因此在主线程上执行此操作会太慢,而是从串行队列中运行它.另外,我想尽可能地在Objective-C中包含并发代码.
谢谢,
我一直在研究在iOS 4中提供的Accelerate框架.具体来说,我尝试在C中的线性代数库中使用Cblas例程.现在我无法使用这些函数给我在非常基本的例程中获得任何性能提升.具体来说,是4x4矩阵乘法的情况.无论何时我无法利用矩阵的仿射或同质性质,我一直在使用这个例程(删节):
float *mat4SetMat4Mult(const float *m0, const float *m1, float *target) {
target[0] = m0[0] * m1[0] + m0[4] * m1[1] + m0[8] * m1[2] + m0[12] * m1[3];
target[1] = ...etc...
...
target[15] = m0[3] * m1[12] + m0[7] * m1[13] + m0[11] * m1[14] + m0[15] * m1[15];
return target;
}
Run Code Online (Sandbox Code Playgroud)
Cblas的等效函数调用是:
cblas_sgemm(CblasColMajor, CblasNoTrans, CblasNoTrans,
4, 4, 4, 1.f, m0, 4, m1, 4, 0.f, target, 4);
Run Code Online (Sandbox Code Playgroud)
比较两者,通过使它们运行大量充满随机数的预先计算的矩阵(每个函数每次都获得完全相同的输入),当使用C clock()函数计时时,Cblas例程执行速度大约慢4倍.
这对我来说似乎不对,而且我感觉我在某处做错了什么.我是否必须以某种方式启用设备的NEON设备和SIMD功能?或者我不希望用这么小的矩阵获得更好的性能?
非常感谢,
巴斯蒂安