用字符值填充新列的最快方法是什么?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />您好,我有一个执行高级表串联的脚本,我想添加“源列”来指示原始表名称。 我有一些有效的方法,但对于大型表来说,所有方法都很慢。 我也尝试过公式方法,但也不快。 我还可以使用其他技巧吗?
下面的示例与我正在做的非常接近。 1M 行的数据表大小并不罕见,因此我真的很希望在大型表中将此操作降低到低秒数。
谢谢,
麦克风
dt =新表() ;
数据表= { dt } ;
行数= 50000 ;
dt <<添加行(行数) ;
时间2 =今天() ;
如果( 0 ,
dt <<新专栏( “测试” ,特点,设置每个值(评估(数据表[ 1 ]) <<得到名字)) ; // 50k 行需要 24 秒。
,
临时列表= {} ;
为了(我= 1 ,我<=行数,我++,临时列表[我] =评估(数据表[ 1 ]) <<得到名字) ; //104 秒,50k 行。
dt <<新专栏( “测试” ,特点,价值观(临时列表)) ;
) ;
展示(评估(今天() -时间2 )) ;
回复:用字符值填充新列的最快方法是什么?有一个比我的第一个例子更简单的方法,至少对于这种情况是这样。
开始=滴答秒();
dt = 新表();
dt << 新列( "测试", 字符, "标称", 公式(评估( dt << 获取名称 ) ) );
dt << addrows( 1e7 );
dt << 运行公式;
停止=滴答秒();
显示(停止 - 开始);
数据表的 NewColumn 消息的 Formula 参数最初设计为非常易于在常见情况下使用,例如
公式(身高+体重)
其中身高和体重是数据表列,并且应在每一行上进行添加。因此,Formula 不会计算其参数,而只是将未计算的表达式存储为列的公式。
除非...外部函数是评估(...)您可以在上面的更简单的示例中看到这一点。当处理 Formula(...) 参数时,它会查找 Eval 并使用计算结果。JMP 中的其他地方也可以执行此操作。并且,还有其他地方,例如替代函数,使用表达式(...)以防止对表达式参数求值。
回复:用字符值填充新列的最快方法是什么?谢谢克雷格。 在我发布原始消息后,我想到 JMP 的本机 concatenate() 表函数具有“创建源列”选项,并且我能够使用标准连接功能找到此代码,然后单击红色三角形/ 源脚本来看看它是如何工作的。 这个选项似乎没有在任何地方记录。我的脚本使用原始表的两个副本,因此这个中间解决方案需要进行一些操作才能将其恢复为原始表名称。如果它是原始表,这将是一个很好的解决方案。
你的方法相当干净,而且速度当然很快。 对此类内容的需求经常出现,因此我将为此添加书签。 我认为是时候了解这些功能组合的价值了。 我见过它们的使用,当我被告知如何让某些东西正常工作时我会使用它们,但我似乎很少能够识别何时使用它。 这次我很接近... 我以为我的公式可以工作(在OP中提到),但查看代码我记得它不起作用,因为表达式只是出现在公式中。 我想我需要这样的东西,但不知道该怎么做。
关于哪些类型的函数可以/应该包装在表达式中以优化我的脚本,是否有一些经验法则? 或者您会建议只运行它并进行时序分析并修复缓慢的问题,这就是我所做的?
再次感谢,
麦克风
PS,感谢您提醒我有关刻度秒()的信息。 我知道有一个比 Today() 更好的函数。
回复:用字符值填充新列的最快方法是什么?开始=滴答秒();
dt = 新表();
评估(
评估表达式(
dt << 新列(“测试”,
特点,
“标称”,
公式( Expr( dt << getname ) )
)
)
);
dt << addrows( 1e7 );
dt << 运行公式;
停止=滴答秒();
显示(停止 - 开始);
停止-开始= 3.80000000004657; // 4 秒内 10,000,000 行
eval( evalExpr( ... expr( ... ) ... )) 模式是在 JMP 中操作表达式的一种方法。要理解它,请从 EvalExpr( ... ) 开始,它查看其参数以查找任何 Expr( ... )。对 Expr 部分进行求值,并将结果(在本例中为字符串)保留在 Expr 的位置。EvalExpr 的结果是一个表达式,需要通过外层 eval(...) 进行计算
可能有更快的方法;我没有探索太远。
