- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在使用“D 编程”这本书来学习 D。我试图解决一个求和从 1 到 10000000 的数字的平方的问题。我首先采用函数式方法来解决 map 和问题reduce 但随着数字变大,我必须将数字转换为 bigint 以获得正确的输出。
long num = 10000001;
BigInt result;
result = iota(1,num).map!(a => to!BigInt(a * a)).reduce!((a,b) => (a + b));
writeln("The sum is : ", result);
当使用 dmd -O 编译时,上面的代码需要 7 秒才能完成。我分析了程序,大部分时间都浪费在 BigInt 调用上。尽管数字的平方可以放入一个 long 中,但我必须将它们转换为 bigint,以便减少函数求和并返回适当的总和。 python 程序只需 3 秒即可完成。当 num = 100000000 时,D 程序需要 1 分 13 秒才能完成。有没有办法优化对 bigint 的调用。产品本身可以很长,但必须将它们类型转换为 bigint 对象,以便它们从 reduce 操作中给出正确的结果。我尝试将数字的平方插入 bigint 数组,但速度也较慢。我试图将所有数字转换为 Bigint
auto bigs_map_nums = iota(1,num).map!(a => to!BigInt(a)).array;
auto bigs_map = sum(bigs_map_nums.map!(a => (a * a)).array);
但是它也比较慢。我在 How to optimize this short factorial function in scala? (Creating 50000 BigInts) 阅读了答案. D 中较大整数的乘法实现是否也存在问题?有没有办法优化对 BigInt 的函数调用?
python 代码:
timeit.timeit('print sum(map(lambda num : num * num, range(1,10000000)))',number=1)
333333283333335000000
3.58552622795105
代码是在具有 2 GB RAM 的双核 64 位 Linux 笔记本电脑上执行的。 python :2.7.4dmd : DMD64 D 编译器 v2.066.1
最佳答案
没有范围冷却:foreach(x; 0 .. num) result += x * x;
范围很酷(?):
import std.functional: reverseArgs;
result = iota(1, num)
.map!(a => a * a)
.reverseArgs!(reduce!((a, b) => a + b))(BigInt(0) /* seed */);
当然,关键是要避免 BigInt
处理每个元素。
范围版本比非范围版本慢一点。两者都比 python 版本快得多。
编辑:哦!哦!使用 std.algorithm.sum
可以让它变得更加愉快:
result = iota(1, num)
.map!(a => a * a)
.sum(BigInt(0));
关于python - 优化 bigint 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27992282/
我正在使用 gmp 执行复杂的操作。我想使用 Botan 来执行加密功能。问题是他们都有自己的 Bigint 函数。因此,在将 gmp 函数中使用的 bigint 值提供给 Botan 函数时会产生问
我正在尝试运行查询: let query = ` DELETE FROM ${table_name} WHERE
我有以下代码片段: use num_bigint::*; // 0.2.2 use num_traits::*; // 0.2.8 use std::ops::*; fn xgcd(b: &BigIn
我有一个 Postgres 8.2 表,其中列定义为 bigint 数据类型。 当我执行 sum(column) 时,返回类型是 numeric。我想强制将总和类型转换为 bigint,因为我确信结果
我有这样一个场景: CREATE TABLE `Users` ( `IdUser` bigint(20) NOT NULL PRIMARY KEY ) ENGINE=InnoDB DEFAULT
我想遍历一系列具有 BigUint 类型的值(来自 num crate )。 我该怎么做? 我试过了 for i in 0..a {...} 其中 a 是(借用的)BigUint 类型。我收到有关不匹
环境: Ubuntu 14.04 MySql 工作台 6.2.4 MariaDB 10 当我尝试将模型与数据库模式同步时,我已经在一个表中定义了 UNSIGNED BIGINT 类型(即 UNSIGN
我正在使用一个列来存储 UNIX 时间戳以秒为单位(除以 1000)。我发现 bigint 数据类型足以存储它。我使用 创建了它 ... createTimeStamp bigint, ...
我假设一种语言的实现允许您将指针视为整数,包括对它们进行标准算术。如果由于硬件限制这是不现实的,请告诉我。如果编程语言通常没有这么强大的指针运算,但是在实践中是可行的,那么我仍然想知道这种实现BigI
我正在尝试使用 Spark 将数据从 greenplum 移动到 HDFS。我可以从源表中成功读取数据,数据框(greenplum 表)的 spark 推断模式是: 数据框架构: je_header
我有一个表名称file_upload它的 upload_id 列为 BIGINT(11) AI PK NOT NULL当我将表列大小更改为 BIGINT(20) 时,AI 标志被删除,每次更改列中的任
我必须将一些加密代码从我不太熟悉的 java (visual c++) 移植到 visual c++。我在 http://sourceforge.net/projects/cpp-bigint/ 找到
我正在尝试对任意大整数实现 Solovoy-Strassen 素性检验。我还将编写一个 bignum(不能使用第 3 方实现,因为这是一个学术项目)。我已经决定了 bignum 的以下结构: stru
我有两个模型(商店和产品),两者的主键都是 BigInt,但产品(store_id)中的关系列仍然是整数。我不想使用原始 SQL,如何使用 Django 解决此问题? 例子: class Produc
有没有办法得到 BigInt 的对数?在 JavaScript 中? 对于普通数字,您将使用以下代码: const largeNumber = 1000; const result = Math.lo
在我的嵌入式项目中,我有一个处理任意长度整数的 biginteger 类。我希望能够生成一个介于 0 和任意数字之间的随机 bigint。假设我有一个高质量的随机字节源。 我见过的所有实现基本上都做同
我有一个 pandas pyspark 中的数据框.我想将此数据框创建/加载到 hive table 。 pd_df = pandas data frame id
有没有办法获得可以存储在 bigint 中的最大值,而无需对其进行硬编码? 是否有返回/包含此值的函数或常量? 最佳答案 请参阅 this similar question 中提供的答案.据我所知,没
我正在使用 Chapel,我正在尝试对 bigint 执行计算多语言环境设置中的数组。读取每行包含一个整数的文件。每行转换为 bigint记录然后插入到单个数组中。我有 4 个语言环境,因此我要求每个
我有一个存储过程,它必须返回一个 bigint 作为输出。下面如果定义。 在正文中,我在表中插入一行并在 @LogID 输出变量中使用 @@Identity 返回标识。 除返回部分外,一切正常。我试过
我是一名优秀的程序员,十分优秀!