我有一些python-2.x脚本,我在不同的系统,Debian和Arch linux之间复制.Debian将python安装为'/ usr/bin/python',而Arch将其安装为'/ usr/bin/python2'.一个问题是,在Arch linux上,'/ usr/bin/python'也存在,它引用了python-3.x. 所以每次我复制一个文件我都要纠正shebang线,这有点烦人.
在Arch我用
#!/usr/bin/env python2
Run Code Online (Sandbox Code Playgroud)
我在debian上
#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)
由于Debian上不存在'python2',有没有办法传递首选应用程序?也许有一些shell扩展?我不介意它是否依赖于例如'/ bin/sh'.以下会很好,但不起作用.
#!/usr/bin/env python2 python
#!/usr/bin/env python{2,}
#!/bin/sh python{2,}
#!/bin/sh -c python{2,}
Run Code Online (Sandbox Code Playgroud)
令人沮丧的是'sh -c python {2,}'在命令行上运行:即它调用python2可用,否则调用python.
我宁愿不在Debian上创建链接'python2-> python',因为如果我将脚本提供给其他人则不会运行.我也不想让'python'指向Arch上的python2,因为它打破了更新.
没有编写包装器,有没有一种干净的方法可以做到这一点?
我之前已经意识到类似的问题,但我没有看到任何符合我的边界条件的答案:) 有条件的shebang行为不同版本的Python
---更新
我一起破解了一个丑陋的shell解决方案,它现在可以完成这项任务.
#!/bin/bash
pfound=false; v0=2; v1=6
for p in /{usr/,}bin/python*; do
v=($(python -V 2>&1 | cut -c 7- | sed 's/\./ /g'))
if [[ ${v[0]} -eq $v0 && ${v[1]} -eq $v1 ]]; then pfound=true; break; fi
done
if ! $pfound; then echo "no suitable python version …
Run Code Online (Sandbox Code Playgroud) 我有一个带有研讨会的XML文件,我想将其提供给谷歌日历.XML文件由其他人维护并定期更新,因此我想以谷歌自动获取这些更改的方式执行此操作.
我对这种事情没有多少经验,所以我希望有人可以指出我正确的方向.
这是我想要处理的XML的一个示例.
(XML文件:"seminars.xml")
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="ical.xsl"?>
<seminars>
<lastupdate>20150707</lastupdate>
<seminar>
<speaker>A. Einstein</speaker>
<location>Zurich</location>
<date>20150607</date>
<time>15:45:00</time>
<university>Princeton</university>
<abstract>
<title>On the structure of generalized patent office spaces</title>
<content>To be announced.</content>
</abstract>
</seminar>
</seminars>
Run Code Online (Sandbox Code Playgroud)
我想说,实现这一目标最明显的方法是使用XSLT样式表来处理XML并构建一些google-calendar可以读取的文件.我有一个网站/服务器,我可以把这个XSL文件放在理想情况下我希望只能上传一个正确的文件.
我看起来像这样的XSL表.
(XSL文件:"ical.xsl")
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1" media-type="text/calendar"/>
<xsl:variable name="crlf"> </xsl:variable>
<xsl:template match="/">BEGIN:VCALENDAR<xsl:value-of select="$crlf"/>
CALSCALE:GREGORIAN<xsl:value-of select="$crlf"/>
VERSION:2.0<xsl:value-of select="$crlf"/>
SEQUENCE:1<xsl:value-of select="$crlf"/>
X-WR-TIMEZONE:Europe/Paris<xsl:for-each select="seminars/seminar"><xsl:value-of select="$crlf"/>
BEGIN:VEVENT<xsl:value-of select="$crlf"/>
LOCATION:<xsl:value-of select="location"/><xsl:value-of select="$crlf"/>
DTSTART:<xsl:value-of select="date"/>T154500<xsl:value-of select="$crlf"/>
DTEND:<xsl:value-of select="date"/>T164500<xsl:value-of select="$crlf"/>
DESCRIPTION:seminar by <xsl:value-of select="speaker"/><xsl:value-of select="$crlf"/>
SUMMARY:<xsl:value-of select="abstract/title"/><xsl:value-of select="$crlf"/> …
Run Code Online (Sandbox Code Playgroud) 我使用的ScaLAPACK的分而治之算法编写并行矩阵对角化一个小的测试代码PDSYEVD在C.不过,我是新来的ScaLAPACK看着它出现的变量设置为我无法找到一个相当可怕的量源好的例子.我需要对角化的矩阵类型是真实的,对称的,相当稀疏的,大小约为1000x1000.
一个简单的(串行)基于LAPACK的代码如下所示:
/* "matrix diagonalization using lapack" */
#include <stdio.h>
#include <stdlib.h>
/* DSYEV prototype */
extern void dsyev_(char* jobz, char* uplo, int* n, double* a, int* lda,
double* w, double* work, int* lwork, int* info );
#define n 4
int main(int argc, char *argv[])
{
int i,j,info,lda,lwork,N;
double A[n][n], a[n*n], work[100*n],w[n];
/* initialize matrices */
for(i=0;i<n;i++) { for(j=0;j<n;j++) A[i][j] = (i+j); }
/* diagonalize */
N=n; lda=n; lwork=10*n; info=0;
for(i=0;i<n;i++) { for(j=0;j<n;j++) a[i+j*n]=A[i][j]; }
dsyev_("V","L",&N,a,&lda,w,work,&lwork,&info);
/* print …
Run Code Online (Sandbox Code Playgroud) 我试图理解矢量化,但令我惊讶的是这个非常简单的代码没有被矢量化
#define n 1024
int main () {
int i, a[n], b[n], c[n];
for(i=0; i<n; i++) { a[i] = i; b[i] = i*i; }
for(i=0; i<n; i++) c[i] = a[i]+b[i];
}
Run Code Online (Sandbox Code Playgroud)
虽然英特尔编译器由于某种原因导致初始化循环,第5行.
> icc -vec-report a.c
a.c(5): (col. 3) remark: LOOP WAS VECTORIZED
Run Code Online (Sandbox Code Playgroud)
有了海湾合作委员会,我似乎一无所获
> gcc -ftree-vectorize -ftree-vectorizer-verbose=2 a.c
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?这不应该是一个非常简单的可矢量化循环吗?所有相同的操作,连续存储器等.我的CPU支持SSE1/2/3/4.
--- 更新 ---
根据下面的答案,这个例子对我有用.
#include <stdio.h>
#define n 1024
int main () {
int i, a[n], b[n], c[n];
for(i=0; i<n; i++) { a[i] = i; b[i] = i*i; }
for(i=0; …
Run Code Online (Sandbox Code Playgroud) 我有这个非常简单的python代码,我希望通过并行化来加速它.然而,无论我做什么,multiprocessing.Pool.map
都不会在标准地图上获得任何东西.
我已经读过其他线程,其中人们使用这个非常小的函数,这些函数不能很好地并行化并导致过多的开销,但我认为这不应该是这种情况.
难道我做错了什么?
这是一个例子
#!/usr/bin/python
import numpy, time
def AddNoise(sample):
#time.sleep(0.001)
return sample + numpy.random.randint(0,9,sample.shape)
#return sample + numpy.ones(sample.shape)
n=100
m=10000
start = time.time()
A = list([ numpy.random.randint(0,9,(n,n)) for i in range(m) ])
print("creating %d numpy arrays of %d x %d took %.2f seconds"%(m,n,n,time.time()-start))
for i in range(3):
start = time.time()
A = list(map(AddNoise, A))
print("adding numpy arrays took %.2f seconds"%(time.time()-start))
for i in range(3):
import multiprocessing
start = time.time()
with multiprocessing.Pool(processes=2) as pool:
A = list(pool.map(AddNoise, A, …
Run Code Online (Sandbox Code Playgroud)