Theron took five for 44 as Zimbabwe were bowled out for 268. Amla hit 110 and De Villiers 101 not out to propel South Africa to a series-clinching win with 11 overs to spare.
With two runs needed to win, De Villiers, on 95, danced down the pitch and hit Brendan Taylor for six over long-off to raise his century.
Tatenda Taibu made a polished 78 for Zimbabwe but none of his teammates was able to capitalise on reasonable starts on an easy-paced pitch.
Theron, 25, used clever variations of pace and length as he claimed five for 44 to take his haul of wickets to eight in his first two one-day internationals.
Theron had originally been picked only to play in two Twenty20 internationals against Zimbabwe but was added to the one-day squad following a succession of injuries to South Africa’s pace bowlers.
“It’s been a dream start for me,” said Theron, “but you tend to wake up from dreams, so the next part is to try to maintain momentum.”
Amla hit his fifth one-day international century and his fourth in his last seven innings with another fluent performance against a weak Zimbabwe bowling attack.
In repeating the score he made in the first match in Bloemfontein on Friday, Amla faced 103 balls and hit ten fours.
Amla shared stands of 84 for the first wicket with captain Graeme Smith (40) and 137 for the second wicket with De Villiers.
Once regarded as a specialist Test batsman, Amla continued a run of superb form in one-day internationals this year. His last eight innings, all as an opening batsman, have yielded 609 runs at an average of 76.12 and in addition to four hundreds he has had scores of 87 and 92.
De Villiers has been in even more prolific form this year, scoring 646 runs at an average of 107.66, also with four centuries. In his second match since recovering from ankle surgery, he raced to his century off 72 balls with five sixes and five fours.
Taibu was on target to score his third century in five one-day internationals against South Africa until he sliced a catch to backward point off Charl Langeveldt off the first ball of the batting Powerplay, taken with seven overs remaining in the Zimbabwe innings.
Surprisingly dropped down the batting order in both Twenty20 internationals and the first one-day game on Zimbabwe’s short tour, Taibu was promoted to number four on Sunday. He made his runs off 90 balls. He hit four fours and a six and kept the score moving with deft placements and quick running between wickets.
Zimbabwe openers Brendan Taylor and Chamu Chibhabha put on 59 for the first wicket before Theron took two wickets in his first over and Wayne Parnell took another in the next over as the visitors slipped to 60 for three.
The third and final match of the series is in Benoni on Friday. AP