# Why is ParallelDo slower than Do?

I have problems to write parallel code in mathematica. Why is

candidates = {};
SetSharedVariable[candidates];

Do[
ParallelDo[

eq = RandomReal[] + RandomReal[];
AppendTo[candidates, eq]

, {j, 1, 1000}]
, {i, 1, 10}]


slower than the non parallel version

candidates = {};
Do[
Do[

eq = RandomReal[] + RandomReal[];
AppendTo[candidates, eq]

, {j, 1, 1000}]
, {i, 1, 10}]


?

• I reverted your post to before the edit because it looks like a different question (like Henrik said in his comment). Note, however, that if you ask it in precisely such form it will be likely closed due to not enough info: you need to provide the minimal working example, not through some undefined functions into a piece of code that no one will be able to run and test. Apr 11, 2019 at 13:54
• See here mathematica.stackexchange.com/a/48296/12 I suggest you don't use SetSharedVariable until you get quite fluent in using the parallel tools. It effectively "unparallelizes" your code. Apr 11, 2019 at 14:09

Moreover, it is in general more efficient to use Parallel only upon the most outer loop construct.
By the way: Using Append and AppendTo are the worst methods to build a list, because they involve a copy of the full list each time another element is appended. Instead of complexity $$O(n)$$ for a list of $$n$$ elements, you get an implementation of complexity $$O(n^2)$$. Better use Table or, if you don't know how long the list is about to get, use Sow and Reap. InternalBag is a further option, and it is even compilable.
• @MatthiasHeller, you're welcome. How is this new code related to your post? You should consider a new post with your real problem and all relevant data. I may have a look. In general, depending on the details, there are various ways to perform the computation efficiently; these way might not use Parallel at all, but rather Compile`d code. Apr 11, 2019 at 13:13