- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Ramanujan 的公式之一在 Python 上以任意精度计算圆周率:http://en.wikipedia.org/wiki/Approximations_of_%CF%80#20th_century .它基本上需要大量的阶乘和高精度的 float 除法。
我正在使用多个线程来划分无限级数计算,方法是为每个线程提供除以线程数时具有特定模数的所有成员。所以如果你有3个线程,总和应该这样划分 线程 1 ---> 1, 4, 7... 成员 线程 2 ----> 2, 5, 8... 线程 3 ---->3、6、9...
到目前为止,这是我的代码:
from decimal import *
from math import sqrt, ceil
from time import clock
from threading import *
import argparse
memoizedFactorials = []
memoizedFactorials.append( 1 )
memoizedFactorials.append( 1 )
class Accumulator:
def __init__( self ):
self._sum = Decimal( 0 )
def accumulate( self, decimal ):
self._sum += decimal
def sum( self ):
return self._sum
def factorial( k ):
if k < 2: return 1
elif len(memoizedFactorials) <= k:
product = memoizedFactorials[ - 1 ] #last element
for i in range ( len(memoizedFactorials), k+1 ):
product *= i;
memoizedFactorials.append(product)
return memoizedFactorials[ k ]
class Worker(Thread):
def __init__( self, startIndex, step, precision, accumulator ):
Thread.__init__( self, name = ("Thread - {0}".format( startIndex ) ) )
self._startIndex = startIndex
self._step = step
self._precision = precision
self._accumulator = accumulator
def run( self ):
sum = Decimal( 0 )
result = Decimal( 1 )
zero = Decimal( 0 )
delta = Decimal(1)/( Decimal(10)**self._precision + 1 )
#print "Delta - {0}".format( delta )
i = self._startIndex
while( result - zero > delta ):
numerator = Decimal(factorial(4 * i)*(1103 + 26390 * i))
denominator = Decimal((factorial(i)**4)*(396**(4*i)))
result = numerator / denominator
print "Thread - {2} --- Iteration - {0:3} --->{1:3}".format( i, result, self._startIndex )
sum += result
i += self._step
self._accumulator.accumulate( sum )
print
def main( args ):
numberOfDigits = args.numberOfDigits;
getcontext().prec = numberOfDigits + 8
zero = Decimal(1) / Decimal( 10**( numberOfDigits + 1 ) )
start = clock()
accumulator = Accumulator()
threadsCount = args.numberOfThreads;
threadPool = []
for i in range(0, threadsCount ):
worker = Worker( i, threadsCount, numberOfDigits, accumulator )
worker.start()
threadPool.append( worker )
for worker in threadPool:
worker.join()
sum = accumulator.sum();
rootOfTwo = Decimal(2).sqrt()
result = Decimal( 9801 ) / ( Decimal( 2 ) * rootOfTwo * sum )
end = clock();
delta = end - start;
print result;
print ("Took it {0} second to finish".format( delta ) )
#testing the results
#realPiFile = open("pi.txt");
#myPi = str(result)
#realPi = realPiFile.read( len(myPi) - 1 )
#if ( myPi[:-1] != realPi ):
# print "Answer not correct!"
# print "My pi - {0}".format(myPi)
# print "Real pi - {0}".format(realPi)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description = 'Calculate Pi at with arbitrary precision')
parser.add_argument('-p', dest = 'numberOfDigits', default=20, type = int, help ='Number of digits in pi ')
parser.add_argument('-t', '--tasks', dest = 'numberOfThreads', default=1, type = int, help ='Number of tasks( threads )')
parser.add_argument('-o', dest = 'outputFileName', type = str, help ='Connect to VCS testing servers')
parser.add_argument('-q', '--quet', dest = 'quetMode' , action='store_true', help ='Run in quet mode')
args = parser.parse_args()
print args
main(args)
a = raw_input("Press any key to continue...")
让我担心的是,在使用多线程时我的时间加速非常小或没有。例如圆周率的 1000 位: 1 个线程 --> 0.68 秒 2 个线程 --> 0.74 秒 4 个线程 --> 0.75 秒 10 个线程 --> 0.96 秒
关于如何减少时间,您有什么想法吗?我在任务管理器上看到,当使用四个线程时,我的两个核心都参与了 100%。然而时间似乎是一样的。
PS:这是一项家庭作业,所以我不能使用其他公式。 PSS:我使用的是 python 2.7
谢谢:)
最佳答案
Python 有一个 GIL( Global Interpreter Lock ) 可以防止多个线程同时执行 python 代码,也就是说,您无法使用多个线程来加快 CPU 密集型任务的速度。您必须使用多个进程。
关于python - 用多线程计算 Pi(没有加速 - 做什么),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16926853/
我有一个关于 JavaScript 语法的问题。实际上,我在自学 MEAN 堆栈教程时想出了编码(https://thinkster.io/mean-stack-tutorial#adding-aut
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我已经编写了读取开关状态的代码,如果按 3 次 # 则退出。 void allkeypadTest(void) { static uint8_t modeKeyCount=0; do
因此,对于上周我必须做的作业,我必须使用 4 个 do-while 循环和 if 语句在 Java 中制作一个猜谜游戏。我无法成功完成它,类(class)已经继续,没有为我提供任何帮助。如果有人可以查
int i=1,j=0,n=10,k; do{ j+=i; i<<1; printf("%d\n",i); // printf("%d\n",12<<1); }while
此代码用于基本杂货计算器的按钮。当我按下按钮时,一个输入对话框会显示您输入商品价格的位置。我遇到的问题是我无法弄清楚如何获得 do ... while 循环以使输入对话框在输入后弹出。 我希望它始终恢
当我在循环中修改字符串或另一个变量时,它的条件是否每次都重新计算?或者在循环开始前一次 std::string a("aa"); do { a = "aaaa"; } while(a.size<10)
我刚刚写了这个,但我找不到问题。我使用代码块并编写了这个问题 error: expected 'while' before '{' token === Build finished: 1 errors
do { printf("Enter number (0-6): ", ""); scanf("%d", &Num); }while(Num >= 0 && Num 表示“超过”,<表
我有一个包含 10 个项目的 vector (为简单起见,所有项目都属于同一类,称其为“a”)。我想要做的是检查“A”不是 a) 隐藏墙壁或 b) 隐藏另一个“A”。我有一个碰撞函数可以做到这一点。
嗨,这是我的第二个问题。我有下表 |-----|-------|------|------| |._id.|..INFO.|.DONE.|.LAST.| |..1..|...A...|...N..|.
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: Why are there sometimes meaningless do/while and if/e
来自 wikibook在 F# 上有一小部分它说: What does let! do?# let! runs an async object on its own thread, then it i
我在 Real World Haskell 书中遇到了以下函数: namesMatching pat | not (isPattern pat) = do exists do
我有一个类似于下面的用例,我创建了多个图并使用 gridExtra 将它们排列到一些页面布局中,最后使用 ggsave 将其保存为 PDF : p1 % mutate(label2
当我使用具有 for 循环的嵌套 let 语句时,如果没有 (do (html5 ..)),我将无法运行内部 [:tr]。 (defpartial column-settings-layout [&
执行 vagrant up 时出现此错误: anr@anr-Lenovo-G505s ~ $ vagrant up Bringing machine 'default' up with 'virtua
# ################################################# # Subroutine to add data to the table Blas
我想创建一个检查特定日期格式的读取主机。此外,目标是检查用户输入是否正确,如果不正确,则提示应再次弹出。 当我刚接触编程时,发现了这段代码,这似乎很合适。我仍然在努力“直到” do {
我关注这个tutorial在谷歌云机器学习引擎上进行培训。我一步一步地跟着它,但是在将 ml 作业提交到云时我遇到了错误。我运行了这个命令。 sam@sam-VirtualBox:~/models/r
我是一名优秀的程序员,十分优秀!