Making Revolution faster with really big arrays
Dennis Brown
see3d at writeme.com
Wed Apr 13 11:01:22 EDT 2005
To Alex & Dick,
Yes, I am doing something like what Dick suggested, only a lot more
complex --actually I have about a hundred very different calculations
to do on various arrays which is why I was not more specific about the
calculations (it has to do with generating various statistics and
indicators). Your suggestion using the split is just the ticket to
solve my problem in leu of an improved transcript --which would still
be 15 times faster for each pass, but it sure beats all the other ways
I've come up with. Please accept my humble thanks for all your help.
To Frank & Mark & Brian & Robert & Pierre & all,
I have been overwhelmed by all the various offers of help in a few
short hours from posting my problem. You are a wonderful community of
helpful people. Thank you all very much.
From the content of the replies, and the complexity of some of the
proposed solutions it seems more obvious to me now than before that an
improved sequential access method for data needs to be included in
Transcript. After all one should not have to jump through hoops to do
such a simple and common task. I guess the shortcoming of the random
access methods used in the language are not apparent until it is used
with really big arrays which amplify the speed issue. From my
previous posted timings, you can see how much faster sequential access
is than any of the other methods. I can't accept the answer that the
language is unsuitable for a task, because it is interpreted, when a
minor improvement would make it suitable. Let's fix the problem
instead of thinking that Revolution can not be used for such tasks. I
will bet improved sequential access would find its way into most
projects.
I look forward to more discussions about number crunching improvements,
Thanks,
Dennis
On Apr 13, 2005, at 9:59 AM, Alex Tweedly wrote:
> Dennis,
>
> could you post the "dumb, too-slow" code to show what you need to do ?
> The more specifically we can see the problem, the more "imaginative"
> solutions we might come up with.
>
> I suspect some variant of Dick's suggestion (using split on
> all-but-one of the lists, and "for each"-ing over that remaining one)
> - perhaps repeated internally on the items of each line - will get you
> an adequate solution --- but we'll get there more quickly and
> certainly if we know more closely what we are trying to do.
>
> --
> Alex Tweedly http://www.tweedly.net
On Apr 13, 2005, at 5:41 AM, Dick Kriesel wrote:
> On 4/12/05 7:36 PM, "Dennis Brown" <see3d at writeme.com> wrote:
>
>> ...I have two arrays 10,000 lines with 2500 items in each line...
>> ...I need to pair the items together...
>
> Do you have something like closing prices in one container and shares
> traded
> in another container, each for the same 10,000 securities over the same
> 2,500 trading days? If so, do you want to calculate something like
> trading
> volume as price * shares?
>
> If so, then here's a way to bring together the values from one such
> list
> with the values from another, without waiting for any chunk
> expressions. On
> my machine, generating a 10,000 line by 2,500 item list of integers to
> prepare for the test took about three minutes. Then bringing together
> all
> the pairs of lines from two lists, as you indicated in your initial
> email,
> took about 1.2 seconds.
>
> So you could do many passes through your big lists before the day is
> done,
> and not need to wait for an extension to the language.
>
> To try it, paste the following into the script of a new stack. If I've
> misunderstood or done something wrong, please let me know.
>
> -- Dick
> ---------------------
> global gList
>
> on mouseUp
> if gList is empty then initialize
> combinePairsOfLines gList,gList
> end mouseUp
>
> on initialize
> put 10000 into tLineCount
> put 2500 into tItemCount
> put tLineCount && tItemCount & cr
> put the seconds into tSeconds
> repeat with i = 1 to tLineCount
> repeat with j = 1 to tItemCount
> put i + j & comma after tList
> end repeat
> put return after tList
> if i mod 1000 = 0 then put "line count so far:" && i & cr after msg
> end repeat
> put tList into gList -- save for reuse across edit-test cycles
> put "elapsed seconds to initialize:" && \
> the seconds - tSeconds & cr after msg
> end initialize
>
> on combinePairsOfLines pList1,pList2
> put the long seconds into tSeconds
> split pList2 using return
> put 0 into i
> repeat for each line tLineFromList1 in pList1
> add 1 to i
> put tLineFromList1 & pList2[i] into tCombinedLine
> -- doSomethingWithCombinedLine tCombinedLine
> end repeat
> put "elapsed seconds to combine pairs:" && \
> the long seconds - tSeconds & cr after msg
> end combinePairsOfLines
>
>
More information about the use-livecode
mailing list